일부 조건에 따라 정렬 된 세트의 비교 가능한 값을 변경해야하는 문제가있었습니다. 이 같은Java 이상한 동작 설정
이렇게 뭔가 :
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
의 순서를 비교 비교 기준으로 정렬 순서에 따라 didnt는 설정하지만 :
SortedSet의 그룹;
List<T> groupList = new ArrayList<T>(groups);
groups.clear();
for(T t: groupList){
t.setOrdinal(max);
}
groups.addAll(groupList);
예상대로 결과를 얻었습니다. 누군가 나에게 무슨 일이 일어 났는지 설명 할 수 있습니까?
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);
감사
이 내가 사람들을 위해
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;
}
}
이 완료 프로그램을보고 싶어 내 클래스 T 구현 한 방법이다.
문제를 설명하는 짧지 만 완전한 * 프로그램을 보여주십시오.예를 들어'SortedSet'이 커스텀 비교기를 사용했는지 또는 일반적인 'Comparable '구현을 사용했는지 알 수 없다. –
당신이 제시 한 방식대로, 두 가지 방법 모두 잘 작동했을 것입니다. – dasblinkenlight
다른 것들과는 달리, 당신의 compareTo 메소드는 오버플로로 인해 깨졌습니다. 그리고 여러분이 보여준 샘플은 * 모든 * 값의 서수를 같은 값으로 설정합니다. 다시 말하지만, 짧지 만 완전한 프로그램은 ... –