[英]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.