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));
现在这是我要执行的操作:
- 选择 TreeSet 头部的元素。称之为节点。打印出来
- 检查 's' 或与此节点关联的号码。减少 1
- 如果s变为0,则将节点一并从TreeSet中移除
- 一直执行这个表达式直到TreeSet为空
这是我的实现:
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);
我在 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));
现在这是我要执行的操作:
- 选择 TreeSet 头部的元素。称之为节点。打印出来
- 检查 's' 或与此节点关联的号码。减少 1
- 如果s变为0,则将节点一并从TreeSet中移除
- 一直执行这个表达式直到TreeSet为空
这是我的实现:
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);