【发布时间】:2012-09-30 00:04:21
【问题描述】:
我遇到了一个问题,我需要根据某些条件更改已排序集的可比较值。
做这样的事情:
SortedSet<T> groups;
for(T t: groups){
t.setOrdinal(max);
}
不会自动重新排列 SortedSet。
在线阅读我发现我需要从集合中删除对象,然后再次添加它。显然,在迭代集合时我不能这样做。所以我决定制作一个数组列表。使集合为空,然后再次添加所有元素,以便它们遵循排序顺序。 我做了这样的事情:
SortedSet 组;
List<T> groupList = new ArrayList<T>(groups);
groups = null;
for(T t: groupList){
t.setOrdinal(max);
}
groups = new TreeSet<T>(groupList);
但是当我检查组集时,它没有遵循基于比较对象 T 序数的比较器的排序顺序
但是当我尝试这样的事情时:
SortedSet 组;
List<T> groupList = new ArrayList<T>(groups);
groups.clear();
for(T t: groupList){
t.setOrdinal(max);
}
groups.addAll(groupList);
我得到了预期的结果。有人可以解释一下发生了什么吗?
这就是我实现类 T 的方式
public class T implements Serializable, Comparable<T> {
//
int ordinal;
//getter
//setter
@Override
public int compareTo(T that) {
if (that == null) {
return 1;
}
return this.ordinal - that.ordinal;
}
}
想看完整节目的朋友:
List<SmartUser> groupsList = new ArrayList<SmartUser>(groups);
groups = null;
for (SmartUser smartUser : groupsList) {
if (smartUser.isExpired()) {
smartUser.setOrdinal(Long.MAX_VALUE);
}
SmartUserQuery smartUserQuery = smartUser.getSmartUserQuery();
if (smartUserQuery != null) {
//Do parallel processing: of each samrtUser
}
}
groups = new TreeSet<SmartUser>groupsList;
正确的结果给出方法:
List<SmartUser> groupsList = new ArrayList<SmartUser>(groups);
groups.clear();
for (SmartUser smartUser : groupsList) {
if (smartUser.isExpired()) {
smartUser.setOrdinal(Long.MAX_VALUE);
}
SmartUserQuery smartUserQuery = smartUser.getSmartUserQuery();
if (smartUserQuery != null) {
//Do parallel processing: of each samrtUser
}
}
groups.addAll(groupsList);
谢谢。
【问题讨论】:
-
请展示一个简短但完整的程序来说明问题。例如,我们不知道您的
SortedSet<T>是使用自定义比较器还是普通的Comparable<E>实现。 -
从您介绍的方式来看,这两种方式应该都可以正常工作。
-
除此之外,您的
compareTo方法由于溢出而被破坏......并且您显示的示例会将 every 值的序数设置为相同价值,所以任何订单都是可以接受的。再次,请简短但完整的程序... -
您的预期结果是什么?
-
你能描述一下你实际上想用这个做什么吗?试图将其压缩到
SortedSet中只会导致脆弱、容易损坏的代码。