2012-09-28 9 views
5

LinkedListのStringをStringの長さで並べ替える必要がありますが、同じ長さの文字列(辞書的にソートされていない)の順序を保持したいと考えています。LinkedListをソートする方法<String>?

サンプル入力:

this 
is 
just 
a 
test 

サンプル出力:

a 
is 
this 
just 
test 

私はComparable<LinkedList<String>>compareTo方法でこれを行うにしようとしていますが、私は正しい出力を得ることはありません(私はまだ辞書編集で並べ替える)

public class Q3_sorting implements Comparable<LinkedList<String>> { 
    Scanner keyboardScanner = null; 
    LinkedList<String> fileList = new LinkedList<String>(); 

// [...] some codeここ

public int compareTo(LinkedList<String> o) { 
     // TODO Auto-generated method stub 
     o = fileList; 

     for (int i = 0; i < fileList.size() -1; i++) { 
      if (fileList.get(i).length() == o.get(i+1).length()) { 
       return 0; 
      } 
      if (fileList.get(i).length() > o.get(i+1).length()) { 
       return -1; 
      } 
      if (fileList.get(i).length() < o.get(i+1).length()) { 
       return 1; 
      } 

     } 

私はその後、私のメインの方法で
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); を使用しています。私は、リストをプリントアウト...

が、私は出力としてこれを取得:

a 
is 
just 
test 
this 

がどのように私はこの問題を修正しますか?

答えて

3

文字列のリストではなく、文字列をソートしています。これを行うには、次のようにその長さによって2つの文字列を比較することComparator<String>を定義する必要があります。

public class ByLength implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
    return a.length() - b.length(); 
    } 
} 

次に、リストをソートするには、呼び出す必要があります:

Collections.sort(sort.fileList, new ByLength()); 

はまた、仕分けことに注意してくださいLinkedListは非常に非効率的で、ArrayListを代わりに使用する必要があります。

+0

'Collections.sort'を妥当に実装すれば、ソートする前にデータを配列にコピーしてからコピーし直します。しかし、' LinkedList'は一般的に非効率で、通常避けるべきです。 –

-1

文字列には残念なことに、リンクされたリスト内のどの位置に保持されているかを示すプロパティはありません。したがって、その情報を追跡するカスタムデータオブジェクトを作成する必要があります。どちらか、またはリンクされたリストの独自のカスタムソートメソッドを記述し、Collections.sort()の代わりにそれを呼び出す。

6

Collections.sort(list, comparator)オーバーロードを使用してください。 Comparator<LinkedList<String>>ではなく、Comparator<String>が必要です。 Collections.sortのjavadocは、安定したソートを保証します(等しい文字列の順序を保持します。あなたは、コンパレータを作成する必要があります

+0

Ah、ok。私の愚かなこと...ありがとう – user1706571

7

public class Q3_sorting implements Comparator<String> { 
public int compare(String a, String b) { 
return a.length() - b.length(); 
} 

そしてソートそれメソッドを持つ:何がやりたいことは、ソートリスト内の文字列であることを

Collections.sort(list, new Q3_sorting()); 

注意。 Listのコンパレータ(またはこれと同じ目的で動作するコンパイラ)を実装することで、JVMに何を伝えているのかは、異なるListを比較したいということです。

ソートするクラスにComparableを実装することで目的を達成することもできますが、Stringがfinalであれば拡張することはできません。したがって、これより簡単なコンパレータを実装する以外の方法はありません:)

+0

'Comparator'は、' TreeSet'や 'TreeMap'のような' List'実装の並べ替えだけで使用できます。 – Brian

+0

はい。 Arraysユーティリティクラスを使用して、カスタム用途の中から配列をソートすることもできます。 – enTropy

関連する問題