[英]How to combine two Collections.sort functions
我有一個程序,我有一個名單列表,有多少人有這個名字。 我想按字母順序排列名稱,同時將計數從最大到最小。 如果名稱具有相同的計數,則將名稱按字母順序排列。 我想出了如何將名稱放在abc順序中,並想出如何將計數放在最小到最小但我無法弄清楚如何將兩者結合起來獲得最大和最小的名稱列表,如果它們具有相同的字母數訂購。
Collections.sort(oneName, new OneNameCompare());
for(OneName a: oneName)
{
System.out.println(a.toString());
}
Collections.sort(oneName, new OneNameCountCompare());
for(OneName a: oneName)
{
System.out.println(a.toString());
}
您可以制作另一個Comparator
其他兩個Comparator
效果的Comparator
。 如果一個比較器比較相等,則可以調用第二個比較器並使用其值。
public class CountNameComparator implements Comparator<Name>
{
private OneNameCompare c1 = new OneNameCompare();
private OneNameCountCompare c2 = new OneNameCountCompare();
@Override
public int compare(Name n1, Name n2)
{
int comp = c1.compare(n1, n2);
if (comp != 0) return comp;
return c2.compare(n1, n2);
}
}
然后你可以只調用一次Collections.sort
。
Collections.sort(oneName, new CountNameComparator());
這可以推廣到任意數量的比較器。
您可以組合這樣的比較器
public static <T> Comparator<T> combine(final Comparator<T> c1, final Comparator<T> c2) {
return new Comparator<T>() {
public int compare(T t1, T t2) {
int cmp = c1.compare(t1, t2);
if (cmp == 0)
cmp = c2.compare(t1, t2);
return cmp;
}
};
}
BTW Comparators是何時使用無狀態單例的一個很好的例子。 所有比較器或類型都相同,因此您只需要其中一個。
public enum OneNameCompare implements Comparator<OneName> {
INSTANCE;
public int compare(OneName o1, OneName o2) {
int cmp = // compare the two objects
return cmp;
}
}
這樣可以避免創建新實例或緩存副本。 您只需要每種類型中的一種。
假設您正在使用Apache Commons Collections API,您可能需要查看ComparatorUtils.chainedComparator
:
Collections.sort(oneName, ComparatorUtils.chainedComparator(new OneNameCompare(), new OneNameCountCompare());
使用Java 8中的lambdas:
Collections.sort(Arrays.asList(""),
(e1, e2) -> e1.getName().compareTo(e2.getName()) != 0 ?
e1.getName().compareTo(e2.getName()) :
e1.getCount().compareTo(e2.getCount()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.