我有一個問題,我需要根據某些條件更改排序集的可比較值。Java設置奇怪的行爲
做這樣的事情:
SortedSet<T> groups;
for(T t: groups){
t.setOrdinal(max);
}
不會自動重新排列的SortedSet。
在線閱讀我發現我需要從集合中刪除對象,然後再次添加它。顯然,我不能在迭代集合的時候這樣做。所以我決定製作一套Arraylist。使集合爲空,然後再次添加所有元素,以便它們遵循排序的順序。 我做了這樣的事情:
SortedSet groups;
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'是否使用了自定義比較器或正常的'Comparable '實現。 –
從你提出的方式來看,這兩種方式都應該工作得很好。 – dasblinkenlight
除了其他方面,您的'compareTo'方法由於溢出而中斷...並且您顯示的示例將*每個*值的序數設置爲相同的值,因此任何順序都是可接受的。再次,短,但完整的程序,請... –