2015-08-26 2 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, но как сортировать с помощью свойство2? Я пытаюсь сортировать с использованием разных параметров, но 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 (Объект) – 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

Java 8 предоставляет некоторые удобные функции в интерфейсе Comparator.

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

Если вы хотите вложить компараторы, есть еще приятные функции.

Collections.sort(list, Comparator.comparingInt(Field::getX).thenComparingInt(Field::getY)); 
Смежные вопросы