Как искать в наборе (используя компаратор) - PullRequest
1 голос
/ 29 июля 2010

Я хочу искать в множестве, не повторяя вручную элементы, но, похоже, нет способа сделать Collections.search (myset, target, new ComparatorThing ()). Я что-то не вижу?

Спасибо.

Edit:

  • Я ищу другое поле, отличное от естественного порядка элементов.
  • В качестве ручного решения я использовал следующий статический метод. Должно быть хорошо, так как вы не можете делать какие-либо предположения о другом, используя пользовательское поле в компараторе в любом случае.
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;
}

Ответы [ 4 ]

1 голос
/ 29 июля 2010

Взгляните на http://commons.apache.org/collections/, например: public static java.util.Set SetUtils.predicatedSet(set, predicate)

1 голос
/ 29 июля 2010

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

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

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

Можете ли вы подробнее рассказать о своем алгоритме и о том, что вы пытаетесь достичь?

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

0 голосов
/ 29 июля 2010

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

0 голосов
/ 29 июля 2010

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

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

Ссылки

...