[英]Dynamically Sorted Bag of Sets in Java
我有一套,比如
Bag<Set<Integer>> sets
我想編寫一個自定義比較器,以按大小后代對集合進行排序,如下所示:
class SetComparator implements Comparator<Set<Integer>>
{
@Override
public int compare(Set<Integer> i, Set<Integer> j)
{
return j.size() - i.size();
}
}
當我寫
Bag<Set<Integer>> sets = new TreeBag<>(new SetComparator());
Set<Integer> s1 = new HashSet<>();
s1.add(3);
s1.add(4);
s1.add(7);
sets.add(s1);
Set<Integer> s2 = new HashSet<>();
s2.add(1);
s2.add(9);
s2.add(12);
s2.add(29);
sets.add(s2); // the order is [s2, s1]
s1.add(5);
s1.add(12); // the order is still [s2, s1]
當我插入許多套時,它起作用。 但是,當它們的大小更改時,將不保留排序的順序。
有沒有一種方法可以保持集合的大小,但可以動態排序?
通過僅允許將獲取TreeBag
作為參數的特殊Set附加到TreeBag
並在Set更改時在Treebag上調用sort方法是可能的。 我已經嘗試過了,並且它可以工作,但是它有很多缺點(僅允許特殊的Set,如果特殊的Set移到另一個Treebag會怎樣,等等),我將永遠不會在任何通用代碼中使用它,唯一的例外是當代碼非常孤立時。
另一種方法是移動排序的責任Bag
使用的代碼Bag
。 一個簡單的實用程序方法(易於閱讀,易於維護)可以做到:
public class Bag<T> extends HashSet<Set<T>> {
public Bag() {
super();
}
public List<Set<T>> sorted() {
return sorted(new SetComparator<T>());
}
public List<Set<T>> sorted(Comparator<Set<T>> comparator) {
ArrayList<Set<T>> l = new ArrayList<Set<T>>();
l.addAll(this);
Collections.sort(l, comparator);
return l;
}
static class SetComparator<T> implements Comparator<Set<T>> {
@Override
public int compare(Set<T> i, Set<T> j) {
return j.size() - i.size();
}
}
public static void main(String[] args) {
Bag<Integer> b = new Bag<Integer>();
Set<Integer> s1 = new HashSet<Integer>();
b.add(s1);
s1.add(10);
s1.add(11);
Set<Integer> s2 = new HashSet<Integer>();
b.add(s2);
s2.add(20);
System.out.println(b.sorted());
s2.add(21);
s2.add(22);
System.out.println(b.sorted());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.