2015-08-26 59 views
7

我有一個我想使用不同屬性進行排序的對象列表。我想在兩個不同的參數上使用Collections.sort()兩次

@Override 
public int compareTo(Object obj) 
{ 
    Field tab = (Field) obj; 

    int objx = Integer.parseInt(tab.getX()); 
    // int objy = Integer.parseInt(tab.getY()); 

    int classX = Integer.parseInt(this.X); 

    if (classX == objx) 
     return 0; 
    else if (classX > objx) 
     return 1; 
    else 
     return -1; 
} 

我到目前爲止有:

Collections.sort(list1); // But using property1 to sort 
Collections.sort(list1); // But using property2 to sort 

所以,在第一種情況下我可以在使用property1進行排序,但如何使用property2排序? 我試圖用不同的參數排序,但compareTo()只接受一個。

回答

5

如果要使用兩個不同的屬性,你需要使用兩個不同的比較。

比較器是一個實現該接口Comparator

public class EmpSort { 
    static final Comparator<Employee> comp1 = new Comparator<Employee>() { 
     public int compare(Employee e1, Employee e2) { 
      // use prperty1 to sort 
      return e2.hireDate().compareTo(e1.hireDate()); 
     } 
    }; 
} 
public class EmpSort2 { 
    static final Comparator<Employee> comp2 = new Comparator<Employee>() { 
     public int compare(Employee e1, Employee e2) { 
      // use prperty2 to sort 
      return e2.hireDate().compareTo(e1.hireDate()); 
     } 
    }; 
} 

Collections.sort(list1, comp1);//but using prperty1 to sort 
Collections.sort(list1, comp2);//but using prperty2 to sort 

一個相關的問題Collections sort(List<T>,Comparator<? super T>) method example

+0

你的意思是說我必須創建一個包含兩個不同比較器的不同類 – SOP

+0

如果你願意,你可以使用匿名類。 – Rodolfo

6

您可以創建兩個不同的比較爲每個屬性,並傳遞到

Collections.sort(list1, comparator1); 
Collections.sort(list1, comparator2); 
+0

如以上那樣,我重寫方法compaerto(物體OB) – SOP

+1

你將需要寫兩個分開的比較器,並覆蓋每個的compareTo()方法,然後沿着它們傳遞。目前你只寫了一個。你需要爲不同的財產編寫另一個。 –

6
Collections.sort(list1, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      //your compare logic for prperty1 
     } 
    }); 
    Collections.sort(list1, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      //your compare logic for prperty2 
     } 
    }); 
2

爪哇8提供在比較器界面方便一些函數的類。

Collections.sort(list, Comparator.comparingInt(Field::getX)); 
Collections.sort(list, Comparator.comparingInt(Field::getY)); 

如果你想嵌套的比較器有再好的功能。

Collections.sort(list, Comparator.comparingInt(Field::getX).thenComparingInt(Field::getY)); 
相關問題