【问题标题】:Select multiple/random elements from an arraylist从数组列表中选择多个/随机元素
【发布时间】:2017-06-08 17:01:54
【问题描述】:

如何从数组列表中选择随机元素,one 元素除外? 这是我的数组列表:

ArrayList <String> provinces = new ArrayList();

Collections.addAll(
    provinces, 
    "New Brunswick", 
    "Saskatchewan", 
    "Ontario", 
    "Nova Scotia", 
    "Quebec", 
    "Alberta");

对于这个例子,我想随机选择其他元素,除了萨斯喀彻温省。

我已经尝试过:

 for(int i == provinces.get (0); i < provinces.get(1); i > provinces.get(2); i < provinces.get(5)) {

     int getPossibleAnswers = (int) Math.floor(Math.random()*i);               
     String displayPossibleAnswers = provinces.get(getPossibleAnswers);                
     outputAnswers.append(displayPossibleAnswers + "\n");
     }

显然,这段代码不起作用,我不知道该怎么办。 提前致谢!

【问题讨论】:

  • 但是你需要多少元素?
  • 为什么不简单地创建一个没有Saskatchewan 的列表并在上面应用Collections.shuffle

标签: java arraylist random


【解决方案1】:

建立一个所有索引值的列表,除了萨斯喀彻温省的索引,然后随机播放。

List<String> provinces = Arrays.asList("New Brunswick", "Saskatchewan", "Ontario", "Nova Scotia", "Quebec", "Alberta");

List<Integer> indexes = new ArrayList<>();
for (int i = 0; i < provinces.size(); i++)
    if (! provinces.get(i).equals("Saskatchewan"))
        indexes.add(i);
Collections.shuffle(indexes);

StringBuilder outputAnswers = new StringBuilder();
for (int i : indexes)
    outputAnswers.append(provinces.get(i) + "\n");

System.out.print(outputAnswers);

样本输出

Nova Scotia
Quebec
Ontario
Alberta
New Brunswick

【讨论】:

【解决方案2】:

为了保持简洁,作为mentioned,只需创建一个不带Saskatchewanlist

    ArrayList <String> provinces = new ArrayList<>(Arrays.asList("New Brunswick",
                                     "Ontario", "Nova Scotia",
                                     "Quebec",   "Alberta"));

然后随机播放list

Collections.shuffle(provinces);

演示

ArrayList <String> provinces = new ArrayList<>(Arrays.asList("New Brunswick",
                                     "Ontario", "Nova Scotia",
                                     "Quebec",   "Alberta"));
Collections.shuffle(provinces);
StringBuilder builder = new StringBuilder();
for (String s:provinces) {
    builder.append(s+"\n");
}
System.out.println(builder);

输出:

Quebec
New Brunswick
Alberta
Ontario
Nova Scotia

【讨论】:

    【解决方案3】:

    如果您经常需要随机化(例如用于随机测试),您可以添加 Qala Datagen 依赖项,然后获取如下随机元素:

    String e = sample(provinces);
    

    虽然您仍然需要从集合中删除额外的元素。

    免责声明:我是该库的作者。

    【讨论】:

      【解决方案4】:
      ArrayList <String> provinces = new ArrayList<>();
      String removeValue = null;
      Collections.addAll(
          provinces, 
          "New Brunswick", 
          "Saskatchewan", 
          "Ontario", 
          "Nova Scotia", 
          "Quebec", 
          "Alberta");
      
      for (Iterator<String> iterator = provinces.iterator(); iterator.hasNext(); ) {
          String value = iterator.next();
          if (value.equals("Saskatchewan")) {
              removeValue = value;
              iterator.remove();
          }
      }
      
      Collections.shuffle(provinces);
      
      for(String p: provinces){
          System.out.println(p);
      }
      
      provinces.add(removeValue);
      

      我使用了Iterator,因为增强的for 循环不适用于remove(),但如果没有Iterator,您也可以使用索引(数字)进行循环。

      没有Iterator

      for (int j = 0; j<provinces.size(); j++) {
          if(provinces.get(j).equals("Saskatchewan")){
              removeValue = provinces.get(j);
              provinces.remove(provinces.get(j));
          }
      }
      

      也可以不使用Collections.shuffle() 来创建自己的方法。为此,请查看this question

      【讨论】:

        猜你喜欢
        • 2023-01-11
        • 1970-01-01
        • 2014-02-07
        • 2012-01-12
        • 2014-07-23
        • 1970-01-01
        • 2013-10-19
        相关资源
        最近更新 更多