2012-12-08 104 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