Какую коллекцию Java я должен использовать для этого?
Я новичок в Java, и мне трудно понять различия между разными коллекциями. У меня есть список из 19 ресурсов. Каждому ресурсу присваивается шестнадцатеричный цвет. Я хочу получить случайный ресурс с его цветом и использовать этот ресурс с моим кодом. Как только я закончил с текущим ресурсом, я хочу удалить его из списка, чтобы использовать только определенное количество ресурсов.
Должен ли я использовать словарь, карту или хеш-таблицу? Или любые другие, которых мне не хватает.
Ответы
Ответ 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);
});