Сортировка коллекции по двум параметрам одновременно - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть класс с двумя полями даты:

class TestData {
    Date activation;
    Date timeStamp;
}

Я хочу отсортировать список вышеупомянутого класса на основе даты activation, и если они равны, то на основе timestamp т. е. max (активация) и max (timeStamp).

Код, который я пробовал, представляет собой следующие варианты, которые приводят только к max (активация)

public class CollectionSort {

    public static void main(String[] args) {
        List<TestData> testList = new ArrayList<TestData>();

        Collections.sort(testList, new Comparator<TestData>() {

            @Override
            public int compare(TestData t1, TestData t2) {
                int result = 0;
                if (t1.getActivation().before(t2.getActivation())) {
                        result = 1;
                }
                return result;
            }
        });
        System.out.println("First object is " + testList.get(0));
    }
}

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

9 голосов
/ 08 апреля 2011

Вот как это сделать в Plain Java:

 public int compare(TestData o1, TestData o2) {
    int result = o1.getActivation().compareTo(o2.getActivation()));
    if(result==0) result = o1.getTimeStamp().compareTo(o2.getTimeStamp());
    return result;
 }

Или с Гуава (используя ComparisonChain):

public int compare(TestData o1, TestData o2) {
    return ComparisonChain.start()
      .compare(o1.getActivation(), o2.getActivation())
      .compare(o1.getTimeStamp(), o2.getTimeStamp())
      .result();
 }

Или с Commons / Lang (используя CompareToBuilder):

public int compare(TestData o1, TestData o2) {
    return new CompareToBuilder()
      .append(o1.getActivation(), o2.getActivation())
      .append(o1.getTimeStamp(), o2.getTimeStamp())
      .toComparison();
 }

(Все три версии эквивалентны, но простая версия Java является наиболееподробный и, следовательно, наиболее подверженный ошибкам. Все три решения предполагают, что оба o1.getActivation() и o1.getTimestamp() реализуют Comparable).

9 голосов
/ 08 апреля 2011

Это сделает это.!

        Collections.sort(yourList, new Comparator<TestData>() {    
            public int compare(TestData o1, TestData o2) {
                int date1Diff = o1.getActivation().compareTo(o2.getActivation());
                return date1Diff == 0 ? 
                        o1.geTimestamp().compareTo(o2.getTimestamp()) :
                        date1Diff;
            }               
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...