[英]Java Set strange behaviour
我有一個問題,需要根據某些條件更改排序集的可比值。
做這樣的事情:
SortedSet<T> groups;
for(T t: groups){
t.setOrdinal(max);
}
不會自動重新排列SortedSet。
在線閱讀我發現我需要從集合中刪除該對象,然后再次添加它。 顯然,在遍歷集合時我無法做到這一點。 因此,我決定制作一組Arraylist。 將集合設為null,然后再次添加所有元素,以使它們遵循排序的順序。 我做了這樣的事情:
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);
謝謝。
將您的compareTo方法更改為下面
@Override
public int compareTo(CustomObject o) {
return Integer.valueOf(o.ordinal).compareTo(ordinal );
}
此外,根據TreeSet
合同,您應提供equals方法,該方法將與compareTo方法同步
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof CustomObject))
return false;
CustomObject o = (CustomObject) obj;
return this.ordinal == o.ordinal;
}
樣例實現
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class CustomObject implements Comparable<CustomObject> {
private int ordinal = 0;
public CustomObject(int priority) {
this.ordinal = priority;
}
/**
* @param args
*/
public static void main(String[] args) {
List<CustomObject> list = new ArrayList<CustomObject>();
list.add(new CustomObject(1));
list.add(new CustomObject(2));
list.add(new CustomObject(3));
list.add(new CustomObject(6));
list.add(new CustomObject(4));
System.out.println("Before: " + list);
for (CustomObject object : list) {
if (object.ordinal == 4) {
object.ordinal = 10;
}
}
Set<CustomObject> set = new TreeSet<CustomObject>();
set.addAll(list);
System.out.println("After: " + set);
}
@Override
public int compareTo(CustomObject o) {
return Integer.valueOf(o.ordinal).compareTo(ordinal);
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof CustomObject))
return false;
CustomObject o = (CustomObject) obj;
return this.ordinal == o.ordinal;
}
@Override
public String toString() {
return " Ordinal Value is :" + ordinal;
}
}
我發現需要從集合中刪除該對象,然后再次添加它。 顯然,在遍歷集合時我無法做到這一點。 因此,我決定制作一組Arraylist。
看一下我在對象更改值時維護TreeSet排序的答案,並嘗試執行UpdateableTreeSet
實現。 它允許您在迭代排序后的集合時進行延遲更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.