我是Java的新手,我很难理解不同集合之间的差异.我有19个资源的清单.为每个资源分配一个十六进制颜色.我想获得一个随机资源及其颜色,并将该资源与我的代码一起使用.完成当前资源后,我想将其从列表中删除,以便只使用一定数量的资源.
我应该使用字典,地图还是哈希表?或者我失踪的任何其他人.
您可以做的是将资源存储到a中List
,然后通过Collections.shuffle(List> list)
或随机置换它shuffle(List> list, Random rnd)
,最后调用iterator()
结果列表以获取Iterator
可以存储到成员字段中的实例,以便能够迭代您的列表(谢谢到hasNext()
/ next()
)并在完成后删除您的资源remove()
.
这是一个使用String
as资源的伪代码,只是为了表明这个想法:
// Create a read/write list (Arrays.asList returns a read-only list) Listresources = 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 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]
注意:这种方法在你的情况下是有意义的,因为你有一个小列表,请注意,如果你有一个大的列表,并且你打算只检索它的一小部分,你应该考虑使用a Random
来随机获取下一个的索引element(使用nextInt(int bound)
with list.size()
as参数)获取(使用get(int index)
)和删除(使用remove(int index)
)而不是使用,Collections.shuffle(List> list)
因为它会导致开销.
ArrayList
不起作用,因为我需要将颜色(值)分配给资源(键)
是的,如果您使用List
包含颜色和资源的包装类(例如,AbstractMap.SimpleImmutableEntry
或仅包含自定义类),它可以工作.这很好,因为您似乎不需要按资源检索颜色.如果这样做,您可以简单地将Map
资源作为键和颜色作为值并用于new ArrayList<>(map.keySet())
初始化资源列表,然后您将能够应用此答案中先前提出的内容.