TreeSet 中的值更改后不会自行重新排序

TreeSet not Re-Ordering Itself after Values in it are Changed

我在 JAVA 中有一个 TreeSet,它订购了一个名为 'Node' 的自定义数据类型。但是,TreeSet 没有正确排序。

我的完整实现的 link 在底部。先详细解释一下我的问题

这里有一个客户数据类型'Node'。它有 2 个参数。一个字符和一个与之关联的数字。像这样说:

pair<char,int> node;

在 C++ 中。

这是代码:

 class Node
    {
        char c;int s;
        Node(char x,int y)
        {
            c=x;s=y;
        }
    }

我为此 TreeSet 实现了一个比较器,它按 's' 的降序排列元素。因此,例如我们有 2 个节点,一个是 (a,2),另一个是 (b,5),它们将被排序为 (b,5);(a,2)。但是,如果它们的大小相同,则按字典顺序较小的字符会排在前面。

TreeSet<Node> ts=new TreeSet<Node>(new Comparator<Node>()
{
    @Override
    public int compare(Node o1, Node o2)
    {
        if(o2.s!=o1.s)
        {
            return o2.s-o1.s;
        }
        return (o1.c-o2.c);
    }
});

现在我输入以下值:

ts.add(new Node('a',3));
ts.add(new Node('b',2));
ts.add(new Node('c',1));

现在这是我要执行的操作:

这是我的实现:

while(ts.size()!=0)
{
    Node node=ts.first();
    System.out.println(node.c+" "+node.s);//Printing the character and the number associated with it
    if(node.s==1)
    {
        ts.pollFirst();//removing redundant node as reducing it by 1 will become 0
    }
    else
    {
        ts.first().s--;//Reducing it's size
    }
}

这是我的问题:

Current Output:                                      Expected Output:

a 3                                                  a 3                                                   
a 2                                                  a 2
a 1 //In this iteration, b has the largest number    b 2
b 2                                                  a 1
b 1                                                  b 1
c 1                                                  c 1

为什么 TreeSet 不对自身重新排序并且表现得更像一个列表?我该如何纠正?

最近我已经习惯了 'Comparator' 的想法,所以如果有的话,请原谅我在实施中的一些错误。

这里是完整的实现:http://ideone.com/As35FO

当您更改元素的值时,TreeSet 不会自行重新排序。如果您希望它们保持有序,您必须取出元素并重新添加它们:

Node first = ts.pollFirst();
first.s--;
ts.add(first);