从一个ArrayList中选择多个/随机元素

4
我该如何从一个数组列表中随机选择元素,但是要排除一个元素? 这是我的数组列表:
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");
     }

很明显,这段代码不能正常工作,我不知道该怎么办。 提前感谢!

但是你需要多少个元素? - ΦXocę 웃 Пepeúpa ツ
1
为什么不直接创建一个不包含“Saskatchewan”的列表,并在其上应用“Collections.shuffle”呢? - Pavneet_Singh
4个回答

4
构建一个索引值列表,除了Saskatchewan的索引之外,然后对其进行随机排列。
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

抱歉,我对Java还比较新,冒号(:)是什么作用? - Pendle S
@PendleS 这是增强型的 for 循环,也被称为 foreach 循环。请参阅:Java 中增强型 for 循环的语法是什么? - Andreas
感谢您的回答。 - Pendle S

1
为了简洁明了,如所述,只需创建一个不包含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

0
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(),你可以创建自己的方法。要做到这一点,请查看这个问题


0
如果您经常需要随机化(例如进行随机测试),您可以添加Qala Datagen依赖项,然后像这样获取一个随机元素:
String e = sample(provinces);

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接