1

ある条件に基づいて、ソートされたセットの比較可能な値を変更する必要があるという問題がありました。

このようなことをする:

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);

ありがとう。

4

2 に答える 2

0

セットからオブジェクトを削除してから、再度追加する必要があることがわかりました。明らかに、セットを繰り返し処理している間はできません。そこで、セットの Arraylist を作成することにしました。

オブジェクトが値を変更するときに TreeSet ソートを維持するという私の答えを見て、私のUpdateableTreeSet実装を試してください。ソートされたセットを繰り返し処理しながら、遅延更新を行うことができます。

于 2012-10-27T10:44:21.417 に答える
0

compareTo メソッドを以下に変更します

@Override
public int compareTo(CustomObject o) {
    return Integer.valueOf(o.ordinal).compareTo(ordinal );
}

また、TreeSet契約に従って、compareTo メソッドと同期する equals メソッドを提供する必要があります。

 @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;
}

}
于 2012-10-09T16:01:03.003 に答える