Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该为此使用哪种Java集合?_Java_Collections - Fatal编程技术网

我应该为此使用哪种Java集合?

我应该为此使用哪种Java集合?,java,collections,Java,Collections,我对Java相当陌生,在理解不同集合之间的差异时遇到困难。我有一个19种资源的列表。每个资源都分配了一个十六进制颜色。我想得到一个随机资源及其颜色,并使用该资源与我的代码。完成当前资源后,我希望将其从列表中删除,以便只使用一定数量的资源 我应该使用字典、地图还是哈希表?或者我缺少的任何其他资源。您可以做的是将资源存储到列表中,然后通过或随机排列,最后调用生成的列表以获取迭代器的实例,您可以将其存储到成员字段中,以便能够在列表中进行迭代(感谢/)并在完成后删除您的资源 下面是一个伪代码,它使用St

我对Java相当陌生,在理解不同集合之间的差异时遇到困难。我有一个19种资源的列表。每个资源都分配了一个十六进制颜色。我想得到一个随机资源及其颜色,并使用该资源与我的代码。完成当前资源后,我希望将其从列表中删除,以便只使用一定数量的资源


我应该使用字典、地图还是哈希表?或者我缺少的任何其他资源。

您可以做的是将资源存储到
列表中,然后通过或随机排列,最后调用生成的列表以获取
迭代器的实例,您可以将其存储到成员字段中,以便能够在列表中进行迭代(感谢/)并在完成后删除您的资源

下面是一个伪代码,它使用
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);
}
当你有一个小的列表时,这个方法是有意义的,请注意,如果你有一个大的列表,你只想检索其中的一小部分,你应该考虑使用A来随机获取下一个元素的索引(使用<代码>列表)(siz()/<代码作为参数)来获取(使用)和移除(使用)。而不是使用
Collections.shuffle(List-List)
,因为这会导致开销


ArrayList
无法工作,因为我需要将颜色(值)指定给 资源(关键)

是的,如果您使用一个包装类的
列表
,它将同时包含颜色和资源(例如,或者只是一个自定义类),那么它就可以工作。这已经足够好了,因为您似乎不需要按资源检索颜色。如果您这样做,您只需使用一个
Map
,其中resource作为键,color作为值,并使用
newarraylist(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");
//初始化
Map resourceMap=newhashmap();
resourceMap.put(“hex1”,hex1Resource);
resourceMap.put(“hex2”,hex3Resource);
resourceMap.put(“hex3”,hex3Resource);
//明确
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);
//初始化
列表=新的ArrayList();
增加(资源1);
增加(资源2);
增加(资源3);
//随机
Random rand=新的Random();
Resource randomResource=list.get(rand.nextInt(list.size());
//从列表中删除元素
列表。删除(随机资源);
使用集合

// 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);
//初始化
Set=newhashset();
set.add(resource1);
set.add(resource2);
set.add(resource3);
//转换为列表,因为集合没有get(int)方法。
列表=新的ArrayList(集合);
//随机
Random rand=新的Random();
Resource randomResource=list.get(rand.nextInt(list.size());
//从列表中删除元素
列表。删除(随机资源);
注意:对于上述两种情况,资源类都需要实现方法equals和hashcode,以便list/set能够比较元素并正确工作。看


更新:集合没有get(int)方法。已更新代码以修复此问题。

以下操作应该可以正常工作。这些步骤是:

  • 创建资源列表
  • 生成一个随机数并获取项目
  • 用你的随机物品做你想做的事
  • 从列表中删除它
  • 示例代码: 大宗报价

    若你们需要更好的随机顺序,你们可以选择列表对象

    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);
              });
    
    List resourceMap=new CopyOnWriteArrayList();
    resourceMap.add(“hex1”);
    添加(“hex2”);
    添加(“hex3”);
    添加(“hex4”);
    集合。洗牌(resourceMap);
    resourceMap.forEach(资源->{
    resourceMap.remove(资源);
    });
    
    我不明白您的确切要求,但如果您需要字典或地图之类的东西,那么
    HashMap
    将是标准选择。需要更多信息。你需要把它们分类吗?可以多次添加资源吗?资源是否有某种标识符,您可以使用它来搜索特定的资源,还是一次检查所有的资源并使用它们?因为您只有19项,所以可以随意使用。您永远不会注意到更改
    ArrayList
    很好
    Collections.shuffle()
    将确保您以随机顺序取出减压器。@ShoeLace1291您首先写道“我认为我不需要通过颜色获取资源”,然后写道“我需要将颜色(值)分配给资源(键)”。。。那么这是什么呢?只是一个小问题,列表和集合如何解决这个问题呢?他需要一个资源和与之相关的颜色,您只在列表或集合中存储它们中的任何一个。@sameerasy总是有
    list
    的选项,或者数据的自定义包装类。他应该提到这一点,对吗@4castle如果你看他的列表声明,它只是
    list
    @4castle,如果颜色不是关键点怎么办?根据问题,它可能是重复的。@gtiwari333一个
    列表将允许重复。请注意,如果从初始列表中随机选取一小部分元素,洗牌整个列表会导致大列表的开销。@SpaceTrucker我同意,但这里的列表只由
    19
    元素组成,所以我不相信在这种情况下开销会这么大,特别是如果只做一次,这样开销就不重要了。请注意,
    新的ArrayList
    是必需的,因为它返回
    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);
              });