ある条件に基づいて、ソートされたセットの比較可能な値を変更する必要があるという問題がありました。
このようなことをする:
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);
ありがとう。