0

各オブジェクトが前と次の変数を持つオブジェクトのリストがあり、それらは文字列型です

List testList=new ArrayList();
CustomObject  o1=new CustomObject();
o1.setPrevious(null);
o1.setNext("a");   

CustomObject  o2=new CustomObject();
o2.setPrevious("a");
o2.setNext("b");

CustomObject o3=new CustomObject ();   
o3.setPrevious("b");
o1.setNext("END");


testList.add(o3); 
testList.add(o1);  
testList.add(o2);

しかし、o1、o2、o3の順序で取得する必要があります。これを行うためにコンパレーターを作成しましたが、正しく取得できません

class OrderComparator implements Comparator{
public int compare(CustomObject  obj1, CustomObject  obj2) {

        if(obj1.getPrevious()==null)
            return -1;
        else if(obj2.getPrevious()==null)
            return 1;
        else if(obj1.getNext()!=null&&obj2.getPrevious()!=null&& obj1.getNext().equals(obj2.getPrevious()))
            return -1;
        else if(obj1.getNext()!=null&&obj2.getPrevious()!=null&&obj2.getNext().equals(obj1.getPrevious()))
            return 1;
        else if(obj1.getNext().equals("END"))
            return -1;
        else if(obj2.getNext().equals("END"))
            return 1;   

        else return 0;
    }

Collections.sort(testList,new OrderComparator());

4

3 に答える 3

0

本当に を使用する必要がある場合Comparator、最も簡単な方法は、リンクされたリストのデータを準備することです。

  • 「オブジェクト」クラスに変数を追加します(またはintそれを呼び出します)orderindex
  • 最初のものから開始し、リンクをたどって最後のものまで行く、設定index=i++;
  • compareメソッドのインデックスを比較します

ところで、あなたはクラスに名前を付けたようですObject。それは良い習慣ではありません。紛らわしくない名前を使用してください。

于 2012-11-07T14:37:21.227 に答える
0

引数にオブジェクトを1つだけ渡す必要があり、他のオブジェクトequals()は呼び出さthisれたオブジェクトであり、たとえば を使用して参照できます

を呼び出すobject1.equals(objec2)場合、メソッドは次のようになります。

public int compare(Object o2) {
    WorkFlowMatrix obj2 = null;
    if(o2!=null)
        obj2 = (WorkFlowMatrix) o2;
    else
        return -1;

    if(this.getPrevious()==null)
        return -1;
    else if(obj2.getPrevious()==null)
        return 1;
    else if(this.getNext()!=null&&obj2.getPrevious()!=null
                                   && this.getNext().equals(obj2.getPrevious()))
        return -1;
    else if(this.getNext()!=null&&obj2.getPrevious()!=null
                                    &&obj2.getNext().equals(this.getPrevious()))
        return 1;
    else if(this.getNext().equals("END"))
        return -1;
    else if(obj2.getNext().equals("END"))
        return 1;   
    else return 0;
}
于 2012-11-07T14:37:36.273 に答える
0

あなたの比較方法は完全ではありません。次の順序付けされたオブジェクトのリストを考えてみましょう: obj1、obj2、obj3、obj4、obj5、END obj1 と obj5 を比較メソッドに渡すと、正しく処理されません。その理由は、オブジェクト o が与えられた場合、その前、次、前のオブジェクトの前の前、次のオブジェクトの次をチェックしているためです。

この問題は、次の疑似コードを使用して解決できます。

//Checking if o1 is greater
Object o=o1.previous;
while(true){
   if ( o == null ) then o2 is not less than o1;
   if(o.equals(o2)) then o2 is less than o1
   else o=o.previous;
}

同様に、o2が大きいかどうかを確認します

于 2012-11-07T14:42:15.433 に答える