У меня возникла проблема, в которой мне нужно изменить сопоставимое значение отсортированного набора на основе некоторого условия.
Делать что-то вроде этого:
SortedSet<T> groups;
for(T t: groups){
t.setOrdinal(max);
}
Не будет автоматически переупорядочивать SortedSet.
Читая онлайн, я понял, что мне нужно удалить объект из набора, а затем добавить его снова. Очевидно, я не могу сделать это, перебирая набор. Поэтому я решил сделать Arraylist набора. Сделайте набор нулевым, а затем снова добавьте все элементы, чтобы они следовали порядку сортировки. Я сделал что-то вроде этого:
группы 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>
. - person Jon Skeet   schedule 09.10.2012compareTo
не работает из-за переполнения... и показанный вами пример устанавливает порядковый номер каждого значения в одно и то же значение, поэтому любой порядок приемлем. Снова короткая, но полная программа, пожалуйста... - person Jon Skeet   schedule 09.10.2012SortedSet
приведет только к хрупкому, легко ломаемому коду. - person Louis Wasserman   schedule 09.10.2012