在java中无法从列表中接收多个不同的随机字符串

v8wbuo2f  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(345)

我想对它进行编码,以便我的代码输出以随机顺序输出列表中的所有字符串,而不是重复和重复它们。我希望用三个以上的变量来实现这一点,但为了简短起见,在这个例子中我只有三个变量

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TestingOutputs {
    public static void main(String[] args) {
        boolean forever = true, one = true, two = true, three = true;
        List<String> outputsList = new ArrayList<String>();
        outputsList.add("One");
        outputsList.add("Two");
        outputsList.add("Three");

        while(forever){
            String outputsRandom = outputsList.get(new Random().nextInt(outputsList.size()));
            while(three) {
                if(outputsRandom.equals("Three")) {
                    System.out.println("This is three");
                    three = false;
                }
            while(two) {
                if(outputsRandom.equals("Two")) {
                    System.out.println("This is two");
                    two = false;
                }
            }
            while(one) {
                if(outputsRandom.equals("One")) {
                    System.out.println("This is one");
                    two = false;
                }
            }
            }
        }
        }

    }
gj3fmq9x

gj3fmq9x1#

一种可能的解决方案是克隆arraylist,随机输出所选项目,然后将其删除。
在代码中,它看起来是这样的:

import java.util.ArrayList;

public class Example {
  public static ArrayList<String> createList() {
    ArrayList<String> listTemp = new ArrayList<String>();
    listTemp.add("one");
    listTemp.add("two");
    listTemp.add("three");

    return listTemp;
  }

  public static void main(String[] args) {
    ArrayList<String> listOutputs = createList();

    // Clone to not alter original list
    ArrayList<String> listTemp = (ArrayList<String>) listOutputs.clone();

    while (listTemp.size() != 0) {
      int index = (int) (Math.random() * listTemp.size());
      System.out.println("Selected element: '" + listTemp.get(index) + "'");
      listTemp.remove(index);
    }
  }
}

然而,vishal的解决方案到目前为止是一种更干净、更有效的方法,尤其是对于更大的列表。

7fyelxc5

7fyelxc52#

首先创建一个从0到字符串数的数字列表。

List<Integer> range = IntStream.rangeClosed(0, outputsList.size() - 1)
    .boxed().collect(Collectors.toList());

无序排列创建的列表,并在for each循环中获取元素:

Collections.shuffle(range);
for(Integer i:range)
{
  outputsList.get(i.intValue());
}

这些数字是随机的,不会重复。希望这能解决你的问题。

相关问题