我对Java还比较陌生,并且很难理解不同集合之间的区别。 我有一个包含19个资源的列表。每个资源都分配了一个十六进制颜色。 我想获取具有其颜色的随机资源,并将该资源与我的代码一起使用。 当我完成当前资源时,我想将其从列表中删除,以便仅使用一定数量的资源。
我应该使用字典,映射还是哈希表? 或者还有其他我没有考虑到的集合类型吗?
我对Java还比较陌生,并且很难理解不同集合之间的区别。 我有一个包含19个资源的列表。每个资源都分配了一个十六进制颜色。 我想获取具有其颜色的随机资源,并将该资源与我的代码一起使用。 当我完成当前资源时,我想将其从列表中删除,以便仅使用一定数量的资源。
我应该使用字典,映射还是哈希表? 或者还有其他我没有考虑到的集合类型吗?
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
随机获取下一个元素的索引(使用list.size()
作为参数调用nextInt(int bound)
)进行获取(使用get(int index)
)和删除(使用remove(int index)
),而不是使用Collections.shuffle(List<?> list)
,因为那会造成开销。
ArrayList
无法工作,因为我需要将颜色(值)分配给资源(键)
如果您使用包含颜色和资源的包装类的List
(例如AbstractMap.SimpleImmutableEntry
或简单的自定义类),那么它可以工作。这足够好,因为您似乎不需要按资源检索颜色。如果您确实需要,您可以简单地拥有一个将资源作为键和颜色作为值的Map
,并使用new ArrayList<>(map.keySet())
初始化资源列表,然后您就能够应用此答案中之前提出的内容。
19
个元素,所以我不认为在这种情况下开销会很大,特别是如果只做一次,那么开销就会微不足道。 - Nicolas Filottonew ArrayList
是必需的,因为从 Arrays.asList
返回的列表在尝试删除元素时会抛出 UnsupportedOperationException
。 - JollyJokerArrays.asList
返回一个只读列表。 - Nicolas Filotto// 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");
如果您想要随机查找资源,有两个选项:
使用列表
// 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);
List<Map.Entry<Color,Resource>>
的选项,或者为数据创建一个自定义的包装类。 - 4castleList
可以允许重复。 - 4castle以下代码应该可以正常工作。步骤如下:
//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
}
}
引用
如果你需要随机顺序,最好使用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);
});
ArrayList
能满足需求。Collections.shuffle()
会确保你得到的资源以随机顺序输出。 - Ole V.V.