2012-01-16 2 views
3

は、私がl.containsを呼び出すと、リストをソートする方法を、遅いと思い私は整数のリストを持っています、どのようにソートするのですか?

List<Integer> l = new ArrayList<Integer>(); 

のような整数のリストを持っています。ソート後、l.containsはより速く動作しますか?

直接ソートされたリストはありますか?

+2

'l.sort()'は機能しません。 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#sort%28java.util.List%29 – Oliver

+3

@Oliver 'sort'は' Collection'で定義されていません – adarshr

+0

これは便利かも知れませんhttp://stackoverflow.com/questions/2661065/a-good-sorted-list-for-java – Marthin

答えて

13

これより簡単になることはできません。

Collections.sort(l); 
4

あなたはそれがある場合でも、配列をソートする想定していないのArrayListに()Collections.sort(l);

1

が含まれている使用することができます。あなたは何らかの種類のセットを使用したいでしょう(HashSetは最高のパフォーマンスを提供し、LinkedHashSetはその注文を保持します)。

0

TreeSetが役に立ちます。

SortedSet<Integer> s = new TreeSet<Integer>(l); 
+0

これにより、重複が削除されることに注意してください。これは、user705414が望むものではない可能性があります。 – Jesper

+0

はい、そうですが、問題の主な目的は** l.contains **をより速く実行させることです。 –

7

リストをソートすると操作が速くなりません。最悪の場合でもまだO(n)である。

ただし、リストをソートして、その上にバイナリ検索を実行することもできます。

Collections.sort(l); 
Collections.binarySearch(l, a); 

これは、最悪の場合、O(lg(n))時間がかかります。

しかし、高性能の操作が必要な場合は、ArrayListの代わりにHashSetを使用することを検討してください。ほぼ一定の時間がかかります。

0

Collections.sort(l)は、望ましい結果が得られない場合は、「コンパレータ」はこのようなものである場合には、Collections.sort(l, comparator)を試してみてください。

class MyComparator implements Comparator<Integer> 
{ 
    public int compare(Integer lhs, Integer rhs) 
    { 
    // perform the desired comparison. 
    } 
} 

編集:私はこれを残しておきますが、「Mairbek Khadikov」によって答えがいるようです最高の答えになる。

関連する問題