簡體   English   中英

分組,然后使用Java比較器對列表進行排序

[英]Group and then sort a list using java comparator

我有一個列表,其中包含產品項目以及購買時間。 是否有可能使用比較器java首先根據產品說明對列表進行排序,然后再按購買日期對列表進行排序?

到目前為止,我可以使用它按日期或描述或其他字段的順序對列表進行排序,但是我想知道是否可以通過使用多個字段對它進行排序?

這是到目前為止我對日期進行的排序。

public int compare(Transaction aTransaction1, Transaction aTransaction2)
    {
        Date lTransactionDate1 = aTransaction1.getTransactionDate();
        Date lTransactionDate2 = aTransaction2.getTransactionDate();

        return lTransactionDate2.compareTo(lTransactionDate1);
    }

提前致謝。

取決於您的比較器。 如果先比較產品說明,然后再比較日期,我想您應該得到的是什么,即首先按說明對產品項進行排序,然后按日期對具有相同說明的項進行排序。

這是一個多字段排序的例子。這里的實現是先按緯度,經度再按高度進行排序。

public class LatLongHt implements Comparable<LatLongHt> {
    public double lat,lng,ht;
    public LatLongHt(double latitude, double longitude, double ht2) {
        this.lat=latitude;
        lng=longitude;
        ht=ht2;
    }
    @Override
    public int compareTo(LatLongHt obj) {
        int result;
        if((result=compareValue(this.lat,obj.lat))==0)      
            if((result=compareValue(this.lng, obj.lng))==0) 
                result=compareValue(this.ht, obj.ht);
        return result;
    }
    private int compareValue(double val1, double val2) {
        if(val1==val2)
            return 0;
        if(val1>val2)
            return 1;       
        return -1;
    }

    @Override
    public String toString(){
        return "("+lat+','+lng+','+ht+')';

    }


    @ Override
    public boolean equals(Object o){
        if(!(o instanceof LatLongHt))       
            return false;
        LatLongHt that=(LatLongHt)o;
        return that.lat==this.lat && that.lng==this.lng && that.ht==this.ht;
    }

  @Override
  public int hashCode() {
     int result=11;  
     result=(int)(31*result+Double.doubleToLongBits(lat));
     result=(int)(31*result+Double.doubleToLongBits(lng));
     result=(int)(31*result+Double.doubleToLongBits(ht));
    return result;
}

}

我希望這可以幫助您了解如何對多個字段進行排序。然后可以根據需要編寫比較器。

Bean Comparator允許您對類中的字段進行排序,因此可以為描述和日期創建單獨的比較器。 然后,您可以使用組比較器將比較器組合為一個。 您的代碼如下所示:

BeanComparator description = new BeanComparator(Transaction.class, "getDescription");
BeanComparator date = new BeanComparator(Transaction.class, "getTransactionDate");
GroupComparator gc = new GroupComparator(description, date);
Collections.sort(yourList, gc);

或者,您可以使用手動創建的各個自定義比較器,而僅使用GroupComparator一次完成兩種排序。

暫無
暫無

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

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