質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

6633閲覧

Java 数字を含む文字列をソートする方法を教えてください

kameoman

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/09/10 10:10

前提・実現したいこと

文字と数字の入った配列を数字を中心に整理したい。
以下の様に降順にしたいです。
【ゴール】
("130:/search/?c=Games+Computers");
("13:/search/?c=Games+Computers");
("12:/search/?c=Games+Computers");
("5:/search/?c=Games+Computers");
("1:/search/?c=Games+Computers");

発生している問題・エラーメッセージ

【現状】

[12:/search/?c=Games+Computers, 130:/search/?c=Games+Computers, 13:/search/?c=Games+Computers, 1:/search/?c=Games+Computers, 5:/search/?c=Games+Computers]

該当のソースコード

java

1import java.util.Collections; 2import java.util.ArrayList; 3 4public class Sort { 5 public static void main(String[] args){ 6 7 ArrayList<String> foo = new ArrayList<>(); 8 9 foo.add("12:/search/?c=Games+Computers"); 10 foo.add("5:/search/?c=Games+Computers"); 11 foo.add("1:/search/?c=Games+Computers"); 12 foo.add("13:/search/?c=Games+Computers"); 13 foo.add("130:/search/?c=Games+Computers"); 14 15 Collections.sort(foo); 16 17 System.out.println(foo); 18 } 19} 20

試したこと

数字だけだと通常通りできました。どうすれば...。

補足情報(FW/ツールのバージョンなど)

java11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

:より前にある数字の降順でソートしたいということであっていますか?

であればCollection.sortの第2引数にComparatorを指定すればよいです。

java

1Collections.sort(foo, Comparator.comparingLong(str -> -1 * Long.parseLong(str.split(":")[0])));

投稿2021/09/10 10:40

neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

他のコードに比べてやや重量級ですが、分割結果を入れられる箱を別クラスとして用意してみました。
ご参考までに。

java

1import java.util.Collections; 2import java.util.List; 3import java.util.ArrayList; 4import java.util.stream.Collectors; 5import java.util.Comparator; 6 7public class Sort { 8 private static class Item { 9 private String org; 10 private long number; 11 private String path; 12 public Item(String s) { 13 this.org = s; 14 String[] strs = s.split(":"); 15 this.number = Long.parseLong(strs[0]); 16 this.path = strs[1]; 17 } 18 public String getOriginal() { 19 return this.org; 20 } 21 public long getNumber() { 22 return this.number; 23 } 24 public String getPath() { 25 return this.path; 26 } 27 } 28 29 public static void main(String[] args) { 30 List < String > foo = new ArrayList < > (); 31 32 foo.add("12:/search/?c=Games+Computers"); 33 foo.add("5:/search/?c=Games+Computers"); 34 foo.add("1:/search/?c=Games+Computers"); 35 foo.add("13:/search/?c=Games+Computers"); 36 foo.add("130:/search/?c=Games+Computers"); 37 38 foo = foo.stream() 39 .map(e - > new Item(e)) 40 .sorted(Comparator.comparing(Item::getNumber, Comparator.reverseOrder()).thenComparing(Item::getPath, Comparator.reverseOrder())) 41 .map(e - > e.getOriginal()) 42 .collect(Collectors.toList()); 43 System.out.println(foo); 44 } 45}

投稿2021/09/11 10:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Comparator を使うと、比較のたびに数字の切り出しと数値への変換が起こるので
データ数が多い場合遅くなるかもしれません。

そこで、TreeMap を使う方法もあります。

Java

1import java.util.TreeMap; 2import java.util.ArrayList; 3 4class Main { 5 public static void main(String[] args){ 6 ArrayList<String> foo = new ArrayList<>(); 7 foo.add("12:/search/?c=Games+Computers"); 8 foo.add("5:/search/?c=Games+Computers"); 9 foo.add("1:/search/?c=Games+Computers"); 10 foo.add("13:/search/?c=Games+Computers"); 11 foo.add("130:/search/?c=Games+Computers"); 12 13 TreeMap<Integer, String> tm = new TreeMap<>(); 14 for (String s : foo) tm.put(-Integer.valueOf(s.replaceAll(":.*", "")), s); 15 for (String s : tm.values()) System.out.println(s); 16 } 17}

foo にデータを戻して表示したい場合は次のようにしてください。

Java

1 int i = 0; 2 for (String s : tm.values()) foo.set(i++, s); 3 System.out.println(foo);

追記
TreeMap がダメだったので、数字の切り出しと数値への変換を最初に行ったものの
ArrayList をソートしてみました。
2つの数値の差は int の範囲に収まる程度に小さいものとします。
数値が同じ場合は、文字列の降順になるようにしました。

Java

1import java.util.Collections; 2import java.util.ArrayList; 3 4public class Main { 5 public static void main(String[] args){ 6 7 ArrayList<String> foo = new ArrayList<>(); 8 foo.add("12:/search/?c=Games+Computers"); 9 foo.add("5:/search/?c=Games+Computers"); 10 foo.add("1:/search/?c=Games+Computers"); 11 foo.add("13:/search/?c=Games+Computers"); 12 foo.add("130:/search/?c=Games+Computers"); 13 foo.add("7:/abc/?c=Games+Computers"); 14 foo.add("7:/xyz/?c=Games+Computers"); 15 16 ArrayList<E> bar = new ArrayList<>(); 17 for (String s : foo) bar.add(new E(s)); 18 19 Collections.sort(bar); 20 21 for (E e : bar) System.out.println("(\"" + e.o + "\");"); 22 } 23} 24 25class E implements Comparable<E> { 26 int n; 27 String o, s[]; 28 29 E(String str) { 30 o = str; 31 s = o.split(":"); 32 n = Integer.parseInt(s[0]); 33 } 34 35 public int compareTo(E e) { 36 int d = e.n - n; 37 return d == 0 ? e.s[1].compareTo(s[1]) : d; 38 } 39}

実行結果

text

1("130:/search/?c=Games+Computers"); 2("13:/search/?c=Games+Computers"); 3("12:/search/?c=Games+Computers"); 4("7:/xyz/?c=Games+Computers"); 5("7:/abc/?c=Games+Computers"); 6("5:/search/?c=Games+Computers"); 7("1:/search/?c=Games+Computers");

投稿2021/09/10 12:50

編集2021/09/11 14:30
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiketa

2021/09/10 13:51

キー重複があったとき、悲しいことになりませんか。データが消えちゃった...
kazuma-s

2021/09/10 14:01

そうですね。同じ数値がある場合はダメですね。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問