0

我有一个对象列表,其中每个对象都有变量 previous 和 next ,它们的类型是 String

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

如果你真的需要使用 a Comparator,最简单的方法是准备你的链表的数据:

  • 添加一个int变量(调用它orderindex)到你的“对象”类
  • 从第一个开始,直到链接后面的最后一个,设置index=i++;
  • 比较compare方法中的索引

顺便说一句,您似乎命名了一个 class Object。这不是好的做法。请使用一个不太容易混淆的名称。

于 2012-11-07T14:37:21.227 回答
0

您只需要在参数中传递一个对象,另一个对象是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 传递给您的 compare 方法,它们将不会被正确处理。原因是给定一个对象 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 回答