我应该使用什么样的Java集合?

时间:2017-01-18 07:56:25

标签: java collections

我对Java很新,并且无法理解不同集合之间的差异。我有19个资源的清单。为每个资源分配一个十六进制颜色。我想获得一个随机资源及其颜色,并将该资源与我的代码一起使用。完成当前资源后,我想将其从列表中删除,以便只使用一定数量的资源。

我应该使用字典,地图还是哈希表?或者我失踪的任何其他人。

4 个答案:

答案 0 :(得分:11)

您可以做的是将资源存储到List,然后通过Collections.shuffle(List<?> list)shuffle(List<?> list, Random rnd)随机置换,最后在结果列表中调用iterator()获取Iterator的实例,您可以将其存储到成员字段中,以便能够遍历您的列表(感谢hasNext() / next())并在完成{{{{}}后删除您的资源3}}

这是一个使用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:这种方法在你的情况下是有意义的,因为你有一个小清单,请注意,如果你有一个大清单,并且你打算只检索它的一小部分,你应该考虑使用remove()随机获取下一个元素的索引(使用Random并将list.size()作为参数)来获取(使用nextInt(int bound))并删除(使用get(int index) })而不是使用Collections.shuffle(List<?> list),因为它会导致开销。

  

ArrayList无效,因为我需要指定颜色(值)   资源(关键)

是的,如果您使用包含您的颜色和资源(例如remove(int index)或仅包含自定义类)的包装类List,它就可以工作。这很好,因为您似乎不需要按资源检索颜色。如果你这样做,你可以简单地将Map作为关键字和颜色作为值,并使用new ArrayList<>(map.keySet())初始化您的资源列表,然后您就可以应用此回答中的建议

答案 1 :(得分:3)

如果您想根据

后面的十六进制使用查找(获取)资源
// 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);

注意 :对于上述两种情况,Resource类需要实现equals和hashcode方法,以便list / set可以比较元素并正常工作。见Java equals and hashcode

更新:集合没有get(int)方法。更新了代码以解决此问题。

答案 2 :(得分:0)

以下内容应该有效。步骤是:

  1. 创建资源列表
  2. 生成随机数并获取项目
  3. 做你想做的随机项目
  4. 从列表中删除
  5. 示例代码:

     //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
        }
    }
    

答案 3 :(得分:0)

  

块引用

如果你需要更好的随机顺序,你可以去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);
          });