簡體   English   中英

用Java中的集合排序

[英]Sorting with collections in java

在對集合進行排序時,我有一個棘手的問題。

我有一個包含以下內容的HashMap

HashMap<String,QuoteBean> mapToSort=new HashMap<<String,QuoteBean>();

QuoteBean基本上是一個Java bean,它具有setter和getter方法的屬性,如下所示。

//class QuoteBean defination

Class QuoteBean implements Serializable{
  private BigDecimal currentPricel
  private BigDecimal  change;
  private BigDecimal TotalChange;
  private String symbol;

//with getter and setter methods  

}//end of the class

現在,當我從地圖上獲取值時,通常會像這樣

Collection values=mapToSort.values();//which will return all the values in the map

此值基本上是QuoteBean對象的集合。 我想在將其發送給客戶端之前對bean進行排序。 現在,我可以使用比較器接口並對它進行排序了。但是問題是排序標准經常更改。 我的意思是有些時候客戶想要用符號來排序,有些時候客戶想要隨着總收益而變化。 標准經常更改。 有沒有一種方法可以將“ compare”函數編寫為重載,並且可以滿足所有條件...

有什么好的方法可以解決這個問題。

如果有人可以回復這個話題,我將不勝感激

謝謝,

是。 實現java.util.Comparator接口並使用重載的方法: Collections.sort(list, comparator) (您將需要從集合的元素中創建一個新的List ,例如new ArrayList(collection)

因此,您可以:

public CurrentPriceQuoteComparator implements Comparator<QuoteBean> {
    @Override
    public int compare(QuoteBean b1, QuoteBean b2) { // implement comparison }
}

public ChangeQuoteComparator implements Comparator<QuoteBean> {
    @Override
    public int compare(QuoteBean b1, QuoteBean b2) { // implement comparison }
}

然后使用Collections.sort(list, ChangeQuoteComparator.INSTANCE);

請注意,最好是聲明每個比較器的單例實例,而不是每次都實例化它:

public static final ChangeQuoteComparator INSTANCE = 
     new ChangeQuoteComparator();

為了進一步擴展內容,您可以定義具有不同比較類型的enum

public enum ComparisonType {
   CHANGE, CURRENT_PRICE; // etc..
}

並定義一個Map以將每種比較類型與相應的比較器進行匹配:

private static final Map<ComparisonType, Comparator<QuoteBean>> comparators = 
      new HashMapMap<ComparisonType, Comparator<QuoteBean>>();

static {
   comparators.put(ComparisonType.CHANGE, ChangeQuoteComparator.INSTANCE);
   comparators.put(ComparisonType.CURENT_PRICE, 
           CurrentPriceQuoteComparator.INSTANCE);
}

然后讓客戶指定他想要的比較

 public List<QuoteBean> getOrdered(ComparisonType type, // other criteria) {
     List<QuoteBean> list = new ArrayList<QuoteBean>(getQuotesCollection());
     Collections.sort(list, comparators.get(type));
     return list;
 }

您可以使用Comparator並創建多個實現,也可以使用動態實現,在其中通過設置參數來更改其工作方式。


對於多種實現,您可以看一下@Bozho答案。

對於動態實現,您可以執行以下操作:

public class DynamicComparator implements Comparator<QuoteBean> {
    public boolean compareCurrentPricel = false;
    public boolean change = false;

    //Setters for the booleans

    @Override
    public int compare(QuoteBean b1, QuoteBean b2) {
        int currentSort = 0;
        if(compareCurrentPricel && currentSort == 0){
            currentSort = compareCurrentPrice1(b1, b2);
        }
        if(change && currentSort == 0){
            currentSort = compareChange(b1, b2);
        }
    }
}

甚至更好:

public class MultipleComparators<T> implements Comparator<T> {
    public List<Comparator<? super T>> comparators;

    public MultipleComparators(List<Comparator<? super T>> comparators){
        this.comparators = comparators;
    }

    @Override
    public int compare(T b1, T b2) {
        int returned = 0;
        for(Comparator<? super T> c : comparators){
            returned = c.compare(b1, b2);
            if(returned != 0){
                break;
            }
        }
        return returned;
    }
}

這樣,您可以使用所需的任何比較器,甚至可以按正確的順序執行多個比較器。

您將必須針對每種情況編寫一個比較器,並且可以根據客戶要求選擇比較器。

最好的解決方案是使用來自Apache Commons的beancomparator對象。 你可以做類似的事情

BeanComparator comparator = new BeanComparator("currentPricel"); Collections.sort(yourlisthere, comparator);

或者你可以直接做一個

Collections.sort(yourlisthere, new BeanComparator("currentPricel"));

暫無
暫無

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

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