Подтвердить что ты не робот

Какую коллекцию Java я должен использовать для этого?

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

Должен ли я использовать словарь, карту или хеш-таблицу? Или любые другие, которых мне не хватает.

4b9b3361

Ответ 1

Что вы можете сделать, это хранить ваши ресурсы в List, а затем произвольно переставляет его с помощью Collections.shuffle(List<?> list) или shuffle(List<?> list, Random rnd) и, наконец, вызовите iterator() на чтобы получить экземпляр Iterator, который вы можете сохранить в поле члена, чтобы иметь возможность выполнять итерацию по вашему списку (благодаря hasNext()/next()) и удалите свой ресурс после выполнения remove().

Вот псевдокод, используя String в качестве ресурса, чтобы показать эту идею:

// Create a read/write list (Arrays.asList returns a read-only list)
List<String> resources = new ArrayList<>(Arrays.asList("1", "2", "3"));
System.out.printf("Initial state = %s%n", resources);
Collections.shuffle(resources);
System.out.printf("Permuted List = %s%n", resources);
Iterator<String> iterator = resources.iterator();
if (iterator.hasNext()) {
    String resource = iterator.next();
    // do something
    iterator.remove();
    System.out.printf("After remove = %s%n", resources);
}

Вывод:

Initial state = [1, 2, 3]
Permuted List = [3, 1, 2]
After remove = [1, 2]

NB: Этот подход имеет смысл в вашем случае, так как у вас есть небольшой список, обратите внимание, что если у вас есть большой список, и вы намерены получить лишь небольшую часть, вам следует рассмотреть используя Random, чтобы случайно получить индекс следующего элемента (используя nextInt(int bound) с параметром list.size()), чтобы получить (используя get(int index)) и удалить (используя remove(int index)) вместо использования Collections.shuffle(List<?> list), поскольку это вызовет накладные расходы.


ArrayList не будет работать, потому что мне нужно присвоить цвет (значение) ресурс (ключ)

Да, он может работать, если вы используете List класса-оболочки, который будет содержать как цвет, так и ваш ресурс (например AbstractMap.SimpleImmutableEntry или просто пользовательский класс). Это достаточно хорошо, поскольку вам, похоже, не нужно извлекать цвет по ресурсам. Если вы это сделаете, вы можете просто иметь Map с ресурсом как ключ и цвет как значение и использовать new ArrayList<>(map.keySet()) для инициализации списка ресурсов, тогда вы сможете применить то, что было предложено ранее в этом ответе.

Ответ 2

Если вы хотите найти (получить) ресурс на основе его использования hex после

// Initialize
Map<String, Resource> resourceMap = new HashMap<>();
resourceMap.put("hex1", hex1Resource);
resourceMap.put("hex2", hex3Resource);
resourceMap.put("hex3", hex3Resource);

// Get specific
Resource hex2Resource = resourceMap.get("hex2");
resourceMap.remove("hex2");

Если вы хотите случайно найти ресурс, есть 2 варианта

  • Использовать список (это позволяет дубликаты)
  • Использовать Set (сохраняет только уникальные значения)

Использование списков

// Initialize
List<Resource> list = new ArrayList<>();
list.add(resource1);
list.add(resource2);
list.add(resource3);

// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));

// Delete the element from list
list.remove(randomResource);

Использование наборов

// Initialize
Set<Resource> set = new HashSet<>();
set.add(resource1);
set.add(resource2);
set.add(resource3);

// Convert to List, since Set does not have get(int) method. 
List<Resource> list = new ArrayList<>(set);

// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));

// Delete the element from list
list.remove(randomResource);

Примечание. В обоих случаях выше класс ресурсов должен реализовать методы equals и hashcode, чтобы список/набор мог сравнивать элементы и работать правильно. См. Java equals и hashcode

Обновить: У наборов нет метода get (int). Обновлен код, чтобы исправить это.

Ответ 3

Следующее должно работать. Шаги:

  • Создайте список ресурсов
  • Создайте случайное число и получите элемент
  • Сделайте то, что вы хотите сделать со своим случайным элементом.
  • Удалить из списка

Пример кода:

 //1
List<Resource> resources= getList();

//2
Random generator = new Random();
Resource randomResource = resources.get(generator.nextInt(resources.size() -1));

//3
//do your stuff

//4
resources.remove(randomResource);

Ресурс может быть классом, который обертывает ваши данные

class Resource{
    String color;
    String otherProperties;
    //..


    @Override
    public boolean equals(Object obj) {
        //generate from IDE or write one
    }

    @Override
    public int hashCode() {
        //generate from IDE or write one
    }
}

Ответ 4

Blockquote

Если вам нужен случайный порядок, вы можете перейти к объекту List.

List<String> resourceMap = new CopyOnWriteArrayList<>();
          resourceMap.add("hex1");
          resourceMap.add("hex2");
          resourceMap.add("hex3");
          resourceMap.add("hex4");
          Collections.shuffle(resourceMap);
          resourceMap.forEach(resource->{
              resourceMap.remove(resource);
          });