Java中动态排序的集合包

Java中动态排序的集合包,java,sorting,dynamic,Java,Sorting,Dynamic,比如说,我有一套 Bag<Set<Integer>> sets 袋组 我想编写一个自定义比较器,按照集合的大小对集合进行排序,如下所示: class SetComparator implements Comparator<Set<Integer>> { @Override public int compare(Set<Integer> i, Set<Integer> j) {

比如说,我有一套

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();
    }

}
类SetComparator实现Comparator
{
@凌驾
公共整数比较(集合i、集合j)
{
返回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]
Bag set=new TreeBag(new SetComparator());
Set s1=新的HashSet();
s1.加入(3);
s1.加入(4);
s1.加入(7);
添加(s1);
Set s2=新的HashSet();
s2.加入(1);
s2.加入(9);
s2.加入(12);
s2.加入(29);
集合。添加(s2);//顺序是[s2,s1]
s1.加入(5);
s1.加入(12);//顺序仍然是[s2,s1]
当我插入多个集合时,它会起作用。但是,当它们的大小发生变化时,排序顺序就不会保留


是否有一种方法可以根据集合的大小保持集合,但可以动态排序?

只允许将特殊集合添加到树状图中,并在集合更改时调用树状图上的排序方法。我尝试过这个方法,但它很有效,但它有很多缺点(只允许使用特殊集,如果特殊集移动到另一个树状结构,会怎么样等等),所以我永远不会在任何通用代码段中使用它,唯一的例外是当代码非常孤立时

另一种方法是将分拣
行李的责任转移到使用
行李的编码上。一种简单实用的方法(易于阅读、易于维护)可以做到:

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());
}
}
公共类包扩展HashSet{
公文包(){
超级();
}
公共列表排序(){
返回排序(新的SetComparator());
}
已排序的公共列表(比较器-比较器){
ArrayList l=新的ArrayList();
l、 阿道尔(这个);
Collections.sort(l,comparator);
返回l;
}
静态类SetComparator实现Comparator{
@凌驾
公共整数比较(集合i、集合j){
返回j.size()-i.size();
}
}
公共静态void main(字符串[]args){
b袋=新袋();
Set s1=新的HashSet();
b、 添加(s1);
s1.加入(10);
s1.加入(11);
Set s2=新的HashSet();
b、 添加(s2);
s2.加入(20);
System.out.println(b.sorted());
s2.加入(21);
s2.加入(22);
System.out.println(b.sorted());
}
}

唯一的方法是将他们保存在
列表中,并且每次都使用它。没有办法“通知”包它必须求助于自己。也许我可以创建一个
线程
,每次我向属于
树状图
成员的集合添加元素时,我都会通知该线程?如果你必须做任何显式通知,那么你应该从包中删除该集合,修改它,然后重新添加它。老实说,不管你怎么做都会一团糟。