簡體   English   中英

Java動態排序袋集合

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

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