Как удалить элементы из списка, которые "ниже", чем указанный элемент - PullRequest
1 голос
/ 23 февраля 2011

У меня есть List<String>, который я отсортировал по алфавиту, используя Collections.sort(...).Теперь у меня есть ссылка String, и я хочу удалить все строки из List, которые «ниже» (в алфавитном порядке), чем моя ссылочная строка.Есть ли какой-нибудь хороший способ сделать это, или я должен пройти по списку один за другим и сравнить каждую запись со справочным значением самостоятельно?

РЕДАКТИРОВАТЬ: Так как кто-то попросил рабочее решение здесьэто.originalList is List<String> ... дубликаты будут потеряны с этим решением

String filterString = "...";
TreeSet<String> tSet = new TreeSet<String>(originalList);
List<String> filteredResources = new ArrayList<String>(tSet.tailSet());

Ответы [ 3 ]

4 голосов
/ 23 февраля 2011

Если дубликатов нет, вы можете сделать это:

  1. Создайте TreeSet с помощью конструктора TreeSet, который принимает коллекцию
  2. Теперь просто вызовите TreeSet.tailSet (refString)
0 голосов
/ 23 февраля 2011

После сортировки было бы тривиально использовать ListIterator , чтобы выполнить итерацию списка и выполнить сравнение. Если вы пропустили сравнение, вы знаете, что можете остановить итерацию, поскольку ваш список отсортирован.

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


Вы также можете использовать алгоритм, который проверяет средний (list.size()/2) элемент, затем снова перемещается вверх или вниз, наполовину сокращая набор результатов, и так далее, пока не найдете точку схождения.

например. поиск "f" со списком {"a", "b", "c", "d", "e", "f", "g"} будет выполнять сравнение по среднему элементу "d", а затем посмотреть на средний "f" элемент второй половины {"e", "f", "g"}, где совпадение будет найдено немедленно, и алгоритм может остановиться.

0 голосов
/ 23 февраля 2011

Вот лучший способ, который я могу придумать.

  1. Сортировка списка
  2. Начните просматривать список по порядку, начиная с самого низкого.
  3. Достигайте точки, пока элемент списка не окажется выше того, который у вас есть.
  4. Вырвитесь из цикла.
  5. Сохраните примечание этого индекса и разбейте список, используя функцию subList по этому индексу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...