Есть ли способ создать условный компаратор в Java?

1

Предположим, что у меня есть класс, который содержит три поля:

class Component {
    private String color;
    private int weight;
    private TreeSet<Component> components = new TreeSet<Component>(new CustomComparator());
}

Есть ли способ создать CustomComparator так, чтобы он сортировал компоненты в TreeSet на основе их цвета тогда и только тогда, когда все компоненты имеют одинаковый вес (в противном случае он сортирует их в соответствии с их весом), не создавая дополнительных компараторов или методы?

  • 0
    Если вы действительно хотите отсортировать «по цвету, если и только если все компоненты имеют одинаковый вес», вы, вероятно, получите лучшее решение, используя два компаратора, один по весу, а другой по цвету, а затем проверьте состояние и используйте тогда соответствующий компаратор.
Теги:
comparator

1 ответ

5
Лучший ответ

Конечно.

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);
  • 0
    Я не думаю, что это соответствует требованию «на основе их цвета, если и только если все компоненты имеют одинаковый вес».
  • 0
    Я считаю, что это было то, что имел в виду ОП.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню