Предположим, что у меня есть класс, который содержит три поля:
class Component {
private String color;
private int weight;
private TreeSet<Component> components = new TreeSet<Component>(new CustomComparator());
}
Есть ли способ создать CustomComparator так, чтобы он сортировал компоненты в TreeSet на основе их цвета тогда и только тогда, когда все компоненты имеют одинаковый вес (в противном случае он сортирует их в соответствии с их весом), не создавая дополнительных компараторов или методы?
Конечно.
new Comparator<Component>() {
@Override public int compare(Component left, Component right) {
int cmp = Integer.compare(left.weight, right.weight);
if (cmp == 0) {
cmp = left.color.compareTo(right.color);
}
return cmp;
}
};
Или, если вы можете использовать сторонние библиотеки, Guava ComparisonChain
делает это еще приятнее:
new Comparator<Component>() {
@Override public int compare(Component left, Component right) {
return ComparisonChain.start()
.compare(left.weight, right.weight)
.compare(left.color, right.color)
.result();
}
};
Или, если вы на Java 8:
Comparator.comparingInt(Component::getWeight) // must have a getter
.thenComparing(Component::getColor);