1

ここで、このメソッドにたどり着いた問題があります。もちろん、必要に応じてさらにコードを提供することもできます。テキスト ファイルがあり、ファイルの各行に異なる自転車が含まれています。各行の形式はcolor::year::price. たとえば、1 台の自転車はred::2008::150.

この情報をリンクリストに保存する予定で、色、年、または価格で注文できるようにしたいと考えています。後でもう一度並べ替える必要はありません。テキストファイルから正しい順序で挿入するだけです。ユーザーが 1、2、または 3 を入力すると、 のような新しいリンク リストが作成LinkedList foo = new LinkedList(1);1れます。これは、色のアルファベット順にノードを追加する必要があることを意味します。 2そして3、それぞれの順序で変数に並べ替えます。私の一般的な実装の仕組みは次のとおりです。

LinkedList color = new LinkedList(1);  //Should sort by color
LinkedList year = new  LinkedList(2);  //"" year
LinkedList price = new LinkedList(3);  //"" price

color.add(new Bike("a::1::1"));
year.add(new Bike("a::1::1"));
price.add(new Bike("a::1::1"));

color.add(new Bike("b::2::2"));
year.add(new Bike("b::2::2"));
price.add(new Bike("b::2::2"));

color.add(new Bike("c::3::3"));
year.add(new Bike("c::3::3"));
price.add(new Bike("c::3::3"));

上記のリンクされたリストの 3 つすべてに同じデータが格納され、異なる順序で表示される必要がありますが、3 つすべてが同じ順序で表示され、最後の要素が複製されます。それらはすべて次のようになります。

a::1::1
b::2::2
c::3::3
c::3::3

これは明らかに間違っています。最後の行は重複してはならず、各連結リストはこれらの値を異なる順序で生成する必要があります。以下はadd()、問題があると思われる私のコードです。レコードの場合、LinkedList オブジェクトには、と値nullの両方の値を持つ 1 つのノードが含まれているだけです。datanext

public void add(Object o){

    Node current = list;
    String currentString = "";
    String oString = o.toString().split("::")[sortOrder - 1];

    while(current.getNext() != null){
        current = current.getNext();
        currentString = current.getData().toString().split("::")[sortOrder - 1];
        //I do the 'sortOrder - 1' bit because when the user enters 1 
        //we should sort by the 0th element, 2 means sort by the 1st element, etc

        if(oString.compareTo(currentString) > 0){
            Node n = new Node(o);
            n.setNext(current.getNext());
            current.setNext(n);
            return;
        }
    }

    current.setNext(new Node(o));
}
4

2 に答える 2

1

ループ内の条件を再確認してください。x.compareTo(y) ?= 0は とまったく同じx ?= yであり、したがってoString.compareTo(currentString) > 0実際には を意味することを覚えておいてくださいoString > currentString

アイテムがあるとしましょう10 -> 20 -> 30 -> null。あなたは25を挿入しています。あなたのcompareTo行は最初に「if (25 > 10) create node nafter this node」と言います。リストは「10 -> 25 -> 20 -> 30 -> null」になります。current代わりに、必要なのはifnewItem > nextまたはの後にのみアイテムを挿入することですnext == null

リンク リストを手動で作成するための学校の演習になれば幸いです。リストを一度保存​​し、ユーザー入力に従ってリストをソートするためにArrayList使用する方がはるかに理にかなっています。Collections.sort(list, comparator)

于 2012-09-21T05:29:18.307 に答える
0

並べ替えロジックを変更するよりも、 Comparator を使用してリストを希望どおりに並べ替えることを検討することもできます。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html

このようにして、単一のリストを維持するだけでよく、リスト要素を好きなように並べ替えて表示できます

使用例はここにあります: http://www.tutorialspoint.com/java/java_using_comparator.htm

于 2012-09-21T05:24:54.607 に答える