Как искать в Наборе (использующий Компаратор)

Я хочу искать в Наборе, не выполняя итерации вручную по elments, но, кажется, нет метода, чтобы сделать Collections.search (myset, цель, новый ComparatorThing ()). Разве я не вижу что-то?

Спасибо.

Править:

  • Я ищу другое поле, чем естественный порядок элементов.
  • Как ручное обходное решение я использовал следующий статический метод. Если хорошо, так как Вы не можете сделать предположения о другом использовании пользовательского поля в компараторе так или иначе.
public static  T search(final Set set, final T searchEntry, final Comparator comparator) {
    for (final T entry : set) {
        if (comparator.compare(entry, searchEntry) == 0) {
            return entry;
        }
    }

    return null;
}
1
задан Benjamin Peter 30 July 2010 в 12:37
поделиться

4 ответа

Взгляните на http://commons.apache.org/collections/ , который предоставляет, например: общедоступный статический java.util.Set SetUtils.predicatedSet (set, predicate)

1
ответ дан 2 September 2019 в 22:37
поделиться

Здесь нужно немного больше деталей - вы пытаетесь искать по отдельному полю в объекте, содержащемся в Set? Или просто найти определенный элемент в Set?

Сама идея Set, как голый интерфейс, не имеет представления об упорядочивании - вам придется перебирать каждый элемент.

Однако если вы ограничитесь SortedSet, в котором уже есть упорядочение, вы, возможно, сможете воспользоваться преимуществами упорядочения, но поскольку Set не допускают случайного доступа, вам все равно придется либо итерировать каждый элемент, либо знать больше информации о коллекции помимо того, что это Set.

Не могли бы вы подробнее описать ваш алгоритм и то, чего вы пытаетесь достичь?

Вероятно, Set не является идеальным способом представления данных, которые вы хотите "искать".

1
ответ дан 2 September 2019 в 22:37
поделиться

Попытка содержит (Объект o) из интерфейса Коллекция . Интерфейс Set расширяет Collection, поэтому все наборы необходимы для реализации методов Collection.

Имейте в виду, что если все, что вы знаете о своем объекте для поиска, это то, что он гарантированно является набором, у вас нет гарантии, что ЕСТЬ какой-либо способ поиска без итерации по каждому элементу, так как этот содержит () метод может работать, а может и не работать, в зависимости от того, какой тип реализации набора вы на самом деле используете.

Ссылки

0
ответ дан 2 September 2019 в 22:37
поделиться

TreeSet имеет некоторые методы, которые могут быть полезны, например ceiling для поиска следующего элемента, большего или равного ключу поиска, floor для получения следующего меньшего элемента. Также headSet, tailSet и subSet для поиска частей множества меньше, больше или между заданными пределами.

0
ответ дан 2 September 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: