🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

3回答

2089閲覧

配列(ArrayList)のソート

KttShK

総合スコア9

Java

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

0グッド

0クリップ

投稿2019/10/25 22:38

素人の質問で恐縮ですがご教示ください。
以下のようなカンマ区切り文字列が配列(ArrayList)に入っており、
これをカンマで区切られた最後の文字列でソートしたいです。

<配列情報>
92675,San Juan Capistrano,Orange (改行 ここまでで1要素)
92676,Silverado,New Jersey  (改行 ここまでで1要素)
92677,Laguna Niguel,New York  (改行 ここまでで1要素)

※上記をOrange、New Jersey、New Yorkで配列をソートしなおしたいです。

よい方法があればご教示お願いいたします。

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

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

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

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

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

swordone

2019/10/26 14:59

Zuishinさんのコメント通り、最後のコンマ以降の文字列のアルファベット順で並び替えるなら、 New Jersey、New York、Orange になるはずです。 Orange、New Jersey、New York というのは何の順番ですか?
KttShK

2019/10/28 03:21

失礼しました。この順番はまだSort前の状態です。 以下のような情報がが大量にランダムに格納されていて、それをListでまとめて出力したいという意図でした。 <格納されている情報>・・・最後のコンマ以降をアルファベット順かつまとめたい。 91307,West Hills,Los Angeles 91308,West Hills,Los Angeles 91309,Canoga Park,New Jersey 91310,Castaic,Los Angeles 91311,Chatsworth,New York 91313,Chatsworth,Hawai 91316,Encino,Los Angeles ・ ・ ・ <出力イメージ> #. County Count of zipcodes ******************************* 1 .Los Angeles : 50 2 .New Yotk : 18 ・ ・ ・
guest

回答3

0

Java

1import java.util.*; 2import java.util.stream.*; 3import static java.util.Comparator.*; 4 5class Wandbox 6{ 7 public static void main(String[] args) 8 { 9 // リストの初期化 10 var list = Arrays.asList( 11 "92675,San Juan Capistrano,Orange", 12 "92676,Silverado,New Jersey", 13 "92677,Laguna Niguel,New York", 14 "Abc", // カンマの含まれていない文字列 15 "" // 空文字列 16 ); 17 18 // カンマ以降の文字列でソートした結果を sorted に入れる。 19 var sorted = list.stream() // リストを Stream に変換。 20 .sorted(comparing(a -> { // 各要素が a に入れられて呼ばれるので、これを比較用に変換して返す。 21 int i = a.lastIndexOf(","); // i には最終カンマの位置が入る。カンマが見つからなかった場合は -1 が入る。 22 return a.substring(i + 1); // カンマの次から文字列を切り出す。 23 })) 24 .collect(Collectors.toList()); // Stream をリストに変換。 25 26 // ソートできたか確認 27 for (var item : sorted) { 28 System.out.println(item); 29 } 30 } 31}

投稿2019/10/26 00:14

Zuishin

総合スコア28669

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

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

Zuishin

2019/10/26 00:23

N の方が O より前で、J の方が Y より前です。 ABCDEFGHI J KLM N O PQRSTUVWX Y Z
dodox86

2019/10/26 01:33

高評価しました。メソッドチェインやC#のLINQ、関数型プログラミングのようなかたちは、慣れてくると一目瞭然なのでしょうね。(私のように、手続き型に慣れているとまだまだ面喰らいます) StreamAPIを使って同様のコードに挑戦していましたが、Zuishinさんのコードを書く速さに遠くおよびませんでした。回答を断念しました。
Zuishin

2019/10/26 01:46

LINQ と同じように考えていると地雷を踏むことがわかったので、練習で書いてみました。 C# はこのところどんどん関数型に寄っていっていますし、他の言語でも似たような傾向を見かけますが、先日 Java で Stream を書いて変態扱いされたのに驚きました。少し啓蒙の意味も入っています。 私の練習なので質問者さんのことは二の次になっていますが、その分コメントを入れたので勘弁して欲しいと思います。
dodox86

2019/10/26 02:31

> Java で Stream を書いて変態扱いされたのに驚きました。少し啓蒙の意味も入っています。 Java/Streamに限らず新技術は実務で採用しようとすると賛否が分かれがちですが、大抵の場合は「より良いものを求めて」追加されたものなのでしょうから、エンジニアとしては食わず嫌い、少なくとも無条件の拒絶は避けたいものです。(回答へのコメントとしては不適切なので、これ以上は控えます。失礼致しました)
guest

0

ベストアンサー

与えられた文字列のデータ仕様に沿った処理のみで書くのであれば、

java

1import java.util.Arrays; 2import java.util.List; 3import java.util.StringTokenizer; 4import java.util.stream.Collectors; 5 6public class SortSample { 7 List<String> list = Arrays.asList( 8 "92675,San Juan Capistrano,Orange", 9 "92676,Silverado,New Jersey", 10 "92677,Laguna Niguel,New York", 11 "Abc", // カンマの含まれていない文字列 12 "" // 空文字列 13 ); 14 15 public static void main(String g[]) { 16 SortSample sample = new SortSample(); 17 18 sample.sort(); 19 } 20 21 void sort() { 22 List<String> sorted = list.stream() 23 .sorted( 24 (e1, e2) -> { 25 return lastElement(e1).compareTo(lastElement(e2)); 26 } 27 ).collect(Collectors.toList()); 28 29 sorted.stream().forEach(System.out::println); 30 31 } 32 33 String lastElement(String target) { 34 StringTokenizer tokenizer = new StringTokenizer(target, ","); 35 String ret = ""; 36 while (tokenizer.hasMoreTokens()) { 37 ret = tokenizer.nextToken(); 38 } 39 return ret; 40 } 41 42} 43

でしょうか。

投稿2019/10/26 14:49

A-pZ

総合スコア12011

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

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

xebme

2019/10/27 04:52

◆おしいところ(1) returnはダサい (e1, e2) -> {return lastElement(e1).compareTo(lastElement(e2));} (e1, e2) -> lastElement(e1).compareTo(lastElement(e2)) ◆おしいところ(2) 高階関数 sort()を高階関数にして比較関数を引数にとるのが常套手段。C言語からずっと同じ考え方。 ◆おしいところ(3) for/returnはダサい lastElement()にもStreamを適用。reduce()を使えばスマートになると思います。(再帰関数もOK) ◆気になるのは? SringTokenizerもいいけれど、ScannerもStringに使えます。Streamとの相性はどっちがいいのだろうか?
guest

0

カンマで区切られた最後の文字列を比較する関数を作って、それでsortすればいいというはなしですね

ArrayList 要素のソートと Comparator

投稿2019/10/25 23:08

y_waiwai

総合スコア88040

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問