Стоит ли переключаться между коллекциями? - PullRequest
0 голосов
/ 06 февраля 2019

Java предлагает нам Коллекции, где каждый вариант лучше всего использовать в определенном сценарии.Но что было бы хорошим решением для комбинации следующих задач:

  1. Быстро перебирайте все элементы в списке (порядок не имеет значения)
  2. Проверьте, содержит ли список (a) определенные элементы

Некоторые рассмотренные варианты, которые могут или не могут быть хорошей практикой:

  • Можно, например, сначала использовать LinkedList, а затем преобразовать его в HashSet, если количество элементов заранее неизвестно (и если дубликатов не будет)
  • Pickрешение для одной из обеих задач и использование одной и той же реализации для другой задачи (если переход на другую реализацию не стоит)
  • Возможно, существует какая-то реализация, которая выполняет обе задачи (не удалось найти одну)

Есть ли «лучшее» решение для этого, и если да, то что это?

РЕДАКТИРОВАТЬ: эта страница для потенциальных будущих посетителей содержит много реализаций с большим OВремя автономной работы.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Быстрая итерация по каждому элементу в списке (порядок не имеет значения)

Если порядок не имеет значения, вы должны перейти к реализации Collection с временной сложностьюO(n), поскольку каждый из них реализует Iterable, и если вы хотите выполнить итерацию по каждому элементу, вы должны посетить каждый элемент хотя бы один раз (следовательно, нет ничего лучше, чем O(n)).Практически, конечно, одна реализация более подходит по сравнению с другой, так как чаще вам приходится принимать во внимание множество факторов.

Проверьте, содержит ли список (а) определенный элемент (ы)

Как правило, это пользовательский случай для Set, у вас будет намного лучшая сложность временидля contains операций.Здесь следует отметить, что Set не имеет предопределенного порядка при итерации по элементам.Он может меняться между реализациями, и рискованно делать предположения об этом.

Теперь к вашему вопросу:

С моей точки зрения, если у вас есть выбор, выбратьСтруктура данных класса самостоятельно, выберите наиболее естественную для этого варианта использования.Если вы можете себе представить, что вам нужно много звонить contains, тогда Set может подойти для вашего случая использования.Вы также можете использовать List, и каждый раз, когда вам нужно позвонить contains (несколько раз), вы можете создать Set со всеми элементами из List ранее.Конечно, если вы будете часто вызывать этот метод, было бы дорого , чтобы создать Set для каждого вызова.Вы можете использовать Set в первую очередь.

В вашем комментарии указано, что у вас есть мир игроков, и вы хотите проверить, является ли игрок частью определенного объекта мира.Так как мир владеет игроками, он также должен содержать Collection некоторого вида для их хранения.Теперь в этом случае я бы порекомендовал Map с общим идентификатором игрока в качестве ключа и самого игрока в качестве значения.

public class World {

    private Map<String, Player> players = new HashMap<>();

    public Collection<Player> getPlayers() { ... }

    public Optional<Player> getPlayer(String nickname) { ... }

    // ...
}
0 голосов
/ 06 февраля 2019

A HashSet может быть быстро повторен и обеспечивает эффективный поиск.

HashSet<Object> set = new HashSet<>();
set.add("Hello");

for (Object obj : set) {
    System.out.println(obj);
}

if (set.contains("Hello")) {
    System.out.println("Found");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...