在java中使用Comparator进行对象比较

时间:2012-11-07 14:33:51

标签: java comparator

我有一个对象列表,其中每个对象都有变量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());

3 个答案:

答案 0 :(得分:0)

如果您确实需要使用Comparator,最简单的方法是准备链接列表的数据:

  • int变量(称之为orderindex)添加到“对象”类
  • 从第一个开始,直到链接后的最后一个,设置index=i++;
  • 比较compare方法
  • 中的索引
顺便说一下,你似乎把它命名为一个班级Object。那不是好习惯。请使用较少混淆的名称。

答案 1 :(得分:0)

您需要在参数中仅传递一个对象其他对象是equals()被称为的对象,并且可以使用{{1例如

如果您想致电this,您的方法应如下所示:

object1.equals(objec2)

答案 2 :(得分: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是否更大