2012-12-08 74 views

回答

2

假设这些对象是Foo类型不落实Comparable<Foo>但确实有一个方法public int getBar()的,你可以通过自己的Comparator<Foo>Collections#sort()像这样:

List<Foo> foos = /* whatever */; 
Collections.sort(foos, new Comparator<Foo>() { 
    @Override 
    public int compare(Foo a, Foo b) { 
     return Integer.compare(a.getBar(), b.getBar()); 
    } 
}); 

注意Integer#compare(int, int) is only since Java 7。如果你使用任何旧的,用这个来代替实施:

public int compare(Foo a, Foo b) { 
     int x = a.getBar(); 
     int y = b.getBar(); 

     return (x < y) ? -1 : ((x == y) ? 0 : 1); 
    } 

这是exactly how Integer#compare() works internally

0

假设共享方法是public Integer sharedMethod()然后执行如下排序:

List<SharedClass> list = new ArraList<SharedClass>(); 
    .... 

    //Sorting here 
    Collections.sort(list, new Comparator<SharedClass>(){ 
     @Override 
     public int compare(SharedClass sc1, SharedClasssc2){ 
      return sc1.sharedMethod().compareTo(sc1.sharedMethod()); 
     } 
    }); 

如果是返回int然后使用Integer.compare方法(Java7),如下:

//Sorting here 
    Collections.sort(list, new Comparator<SharedClass>(){ 
     @Override 
     public int compare(SharedClass sc1, SharedClasssc2){ 
      return Integer.compare(sc1.sharedMethod(), sc1.sharedMethod()); 
     } 
    }); 

如果使用Java版本低于7,则:

//Sorting here 
    Collections.sort(list, new Comparator<SharedClass>(){ 
     @Override 
     public int compare(SharedClass sc1, SharedClasssc2){ 
      int value1 = sc1.sharedMethod(); 
      int value2 = sc1.sharedMethod(); 
      //return 1, if value1 is greater,-1 if smaller and 0 if equal to value2. 
      return (value1 < value2) ? -1 : ((value1 > value2) ? 1 : 0); 
     } 
    }); 
+0

请注意,java中的每个对象都有一个返回int:hashCode()的方法,所以我们不妨使用它。 – bowmore

+0

@ user1886012这取决于您想要在排序中使用哪种方法,属性。根据OP,他/她想要基于返回整数的共享方法进行排序。 –

+0

你是对的,如果他只希望列表快速找到他可以使用hashCode的条目。如果顺序在某种程度上与语义相关,那么hashCode可能不是一个好的选择。 (并且我只为更新我的用户名外观而道歉) – bowmore