5

LinkedListの文字列を文字列の長さで並べ替える必要がありますが、同じ長さの文字列の順序を維持したいと思います(辞書式順序ではありません)。

サンプル入力:

this
is
just
a
test

サンプル出力:

a
is
this
just
test

Comparable<LinkedList<String>>aとメソッドを使用してこれを実行しようとしていcompareToますが、正しい出力が得られません(まだ辞書式にソートしています)

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

//[...]ここにいくつかのコード

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

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

4

4 に答える 4

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 のコンパレータ (または、ここでは同じ目的で機能するため、同等のもの) を実装することで、異なる List を比較したいということを JVM に伝えます。

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

于 2012-09-28T15:18:18.890 に答える
6

オーバーロードを使用してくださいCollections.sort(list, comparator)Comparator<String>ではないが必要ですComparator<LinkedList<String>>。Collections.sort の javadoc は、安定した並べ替えを保証することに注意してください (等しい文字列の順序を維持し、コンパレータに従って等しい平均値を保持します)。

于 2012-09-28T15:17:56.883 に答える
3

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

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());

また、aの並べ替えLinkedListは非常に非効率的であり、ArrayList代わりに使用する必要があることに注意してください。

于 2012-09-28T15:20:17.317 に答える
-1

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

于 2012-09-28T15:17:56.177 に答える