簡體   English   中英

使用比較器對列表名稱和日期進行排序

[英]sorting a list name and date using comparator

我正在嘗試使用比較器實現自定義排序。 到目前為止,我已經能夠按照指定的名稱在列表頂部的順序對列表進行排序,其余的緊隨其后。

碼:

public class SortingTest implements Comparator<SortingTest> {
 String name;
 Date date;

 public SortingTest(String name, Date date) {
    this.name = name;
    this.date = date;
 }

@Override
public int compare(SortingTest o1, SortingTest o2) {
    if (this.name.equals(o2.name)) {
        return 1;
    }
    return 0;
}

public static void main(String[] args) {
    List<SortingTest> list = new ArrayList<SortingTest>();
    Calendar cl = Calendar.getInstance();
    Date d = cl.getTime();
    SortingTest s1 = new SortingTest("Sas", d);
    cl.add(Calendar.DATE, 1);
    Date d1 = cl.getTime();
    SortingTest s2 = new SortingTest("Dave", d1);
    cl.add(Calendar.DATE, 1);
    Date d2 = cl.getTime();
    SortingTest s3 = new SortingTest("Jabir", d2);
    cl.add(Calendar.DATE, 1);
    Date d4 = cl.getTime();
    SortingTest s5 = new SortingTest("Meina", d4);
    cl.add(Calendar.DATE, 1);
    Date d5 = cl.getTime();
    SortingTest s6 = new SortingTest("Sas", d5);
    list.add(s1);
    list.add(s2);
    list.add(s3);
    list.add(s5);
    list.add(s6);

    Collections.sort(list, s1);

    System.out.println("After sorting");
    for (SortingTest st : list) {
        System.out.println(st.name);
    }
}
}

當前代碼輸出:

Sas
Sas
Dave
Jabir
Meina

但我想先按名稱對列表進行排序,然后再按日期對列表進行排序。 因此輸出應為:

Sas, 8/6/2015
Sas, 14/6/2015
Dave, 8/6/2015
Jabir, 10/6/2015
Meina, 11/6/205

更新1:

我的標准是我應該能夠傳遞任何名稱(在本例中為“ sas” / s1)並對列表進行排序,以便傳遞的名稱應位於列表的頂部,然后位於其余的頂部。 因此,在上面的示例中,我已將對象s1傳遞給collection.sort方法。 s1擁有名稱“ sas”,在比較方法中,我正在檢查列表中是否有其他元素具有名稱“ sas”,然后給出值1(在列表頂部),如果沒有則給出0。

首先,您可以實現Comparable而不是Comparator ,這將允許您使用Collections.sort(list)而不是Collections.sort(list, s1)

現在,就我個人而言,我不喜歡更改對象的核心“可比”需求,因為它們可能是出於某種原因而定義的,例如,我更喜歡根據當前需求創建Comparator

Collections.sort(list, new Comparator<SortingTest>() {
    @Override
    public int compare(SortingTest o1, SortingTest o2) {
        int result = o1.name.compareTo(o2.name);
        if (result == 0) {
            result = o1.date.compareTo(o2.date);
        } else {
            result = -result;
        }
        return result;
    }
});

這基本上是比較每個SortingTest實例的名稱,如果它們是0 ,則它將使用Date來確定差異。

然后將輸出類似...

Sas Thu Aug 07 12:30:11 EST 2014
Sas Mon Aug 11 12:30:11 EST 2014
Meina Sun Aug 10 12:30:11 EST 2014
Jabir Sat Aug 09 12:30:11 EST 2014
Dave Fri Aug 08 12:30:11 EST 2014

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM