为此,我应该使用哪种类型的 Java 集合?
我对Java相当陌生,并且很难理解不同集合之间的差异。我有一个包含19个资源的列表。每个资源都分配有十六进制颜色。我想获取一个带有颜色的随机资源,并将该资源用于我的代码。完成当前资源后,我想将其从列表中删除,以便仅使用一定数量的资源。
我应该使用字典、地图还是哈希表?或者我错过的任何其他人。
我对Java相当陌生,并且很难理解不同集合之间的差异。我有一个包含19个资源的列表。每个资源都分配有十六进制颜色。我想获取一个带有颜色的随机资源,并将该资源用于我的代码。完成当前资源后,我想将其从列表中删除,以便仅使用一定数量的资源。
我应该使用字典、地图还是哈希表?或者我错过的任何其他人。
你可以做的是将你的资源存储到一个,然后随机排列它,这要归功于 Collections.shuffle(List<?> list) 或 shuffle(List<?> list, Random rnd),最后在结果列表上调用 iterator() 来获取一个实例,你可以将其存储到成员字段中,以便能够迭代你的列表(感谢 hasNext()/next()), 并在使用 remove() 完成后删除资源。ListIterator
这是一个伪代码用作资源,只是为了展示这个想法: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]
铌:这种方法在你的情况下是有意义的,因为你有一个小列表,请注意,如果你有一个大列表,你打算只检索它的一小部分,你应该考虑使用 Random 来随机获取下一个元素的索引(使用 nextInt(int bound) with as parameter)来获取(使用 get(int index)) 和 remove (using remove(int index))而不是使用,因为它会导致开销。list.size()Collections.shuffle(List<?> list)
ArrayList不起作用,因为我需要将颜色(值)分配给资源(键)
是的,如果您使用一个将同时包含您的颜色和资源的包装器类(例如 AbstractMap.SimpleImmutableEntry 或只是一个自定义类),它可以工作。这已经足够好了,因为您似乎不需要按资源检索颜色。如果您这样做,您可以简单地将资源作为键,将颜色作为值,并用于初始化资源列表,然后您将能够应用之前在此答案中提出的内容。ListMapnew ArrayList<>(map.keySet())
如果要根据其十六进制用法查找(获取)资源,请执行以下操作
// 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个选项
使用列表
// 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);
注意:对于上述两种情况,Resource 类都需要实现方法 equals 和哈希码,以便 list/set 可以比较元素并正常工作。请参阅 Java 等于和哈希码
更新:集合没有 get(int) 方法。更新了代码以解决此问题。