2016-10-04 7 views
-1

私は、内側のArrayListに三番目のパラメータ(状態)によって、外側のArrayListをソートしたいどのように効率的に各ArrayListの特定の値でArrayListのArrayListをソートできますか?

[sally, carp, md] 
[jim, smith, ny] 
[frank, franklin, ca] 

...次の形式ののArrayListを保持するために使用されるのArrayListを有します。並べ替えの結果は次のようになります。

[frank, franklin, ca] 
[sally, carp, md] 
[jim, smith, ny] 

効率的な方法はありますか?

答えて

2

はい、Java8ではかなり簡単です。リストを考える:

List<List<String>> list; //let's assume it's initialized 

あなたと内側のリストの3番目の要素によって外側のリストを並べ替えることができます。

list.sort(Comparator.comparing(l -> l.get(2))); 

しかし、右@duffymoで、おそらくあなたの適切な抽象化を作成したいですドメインモデル。

+0

私は他の2つの答えでラムダをうまく使うのが好きです。よくやった。 – duffymo

+0

私は決して10個以上のオブジェクトをソートしないので、このメソッドを選択しました。これは非常にうまく動作します。ありがとうございました。 – Gabe

4

私はこれをしません。

より良い考え方は、名前、姓、状態をカプセル化し、そのうちの1つをListとするオブジェクトを作成することです。一度それをすればComparatorで簡単です。

効率はBig-Oh behavior of your sorting algorithmによって管理されます。

あなたの最善の策はあなた自身のソーターを書くことではありません。 Collections.sort()を使用してください。

https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

1

あなたは、文字列の配列リストの配列リストを使用していると仮定すると:

arrayList.sort((al1, al2) -> al1[2].compareTo(al2[2])); 

これは、比較するための第三の要素にアクセスするラムダ関数を作成します。

しかし、@duffymoによれば、おそらくarraylistsのarraylistではなくカスタムクラスのarraylistを使用しているはずです。あなたはまだクラスのソートキーを提供する必要があります。ソートキーをソートするには、クラスのラムダ関数を効果的に書く必要があります。

編集:複雑さについてコメントする。

また、私はソートしていた文字列のクラスに基づいて重要なコードの文字列ソートアルゴリズムを選択します。異なるコレクションは、ソートアルゴリズムとは異なる応答をします。 Burstsort、バケットソート、基数ソート(LSD実装とMSD実装の両方)などの非比較アルゴリズムを選択すると、文字列の構造を利用して複雑さを線形にすることができます。どんなデフォルトのジェネリックソートアルゴリズムも、 O(nlog(n))時間でを取ることが証明できる比較(Pythonのtimsortなど)を使用します。それでも、nlog(n)はゆっくりと成長します。

関連する問題