Java - 不想从 LIST 重复但使用 SET 将不起作用

Java - don't want repetitions from LIST but using a SET won't work

我正在尝试将其作为输出:

How many colours do you need?

user inputs a number say 3

结果:

gets 3 RANDOM colours from a list of choices

我的问题是,是的,用户获得了 3 种随机颜色,但其中一些颜色是重复的。 我最终得到,

red
blue
red

我试过使用一个集合,但我不知道如何以一种方式编写它,它会在所述集合中挑选出 3 个随机项目。

我如何选择随机颜色:

colours obj = new colours();

for (int i = 0; i < X; i++) {
    System.out.println(obj.randommm(list)); 
}

public String randommm(List<String> list) {
    int index = random.nextInt(list.size()); return list.get(index); 
}

您可以在添加之前检查列表是否已包含该项目。

假设您已经有了一些颜色列表:

List<Color> allMyColors = something;

然后你可以这样做:

int userInput = 3;
Random rand = new Random();
List<Color> myColors = new ArrayList<Color>();
while(myColors.size() < userInput){
    int index = rand.next(allMyColors.size());
    if(!myColors.contains(allMyColors.get(index))){
        myColors.add(allMyColors.get(index));
    }
}

你当然可以遵循同样的原则,将它缩短一点:

int userInput = 3;
Random rand = new Random();
Set<Color> myColors = new HashSet<Color>();
while(myColors.size() < userInput){
    myColors.add(allMyColors.get(rand.next(allMyColors.size())));
}

请注意,这些并不是您可以获得的最有效的解决方案。但是,它们可能会满足大多数需求。

另一种选择是每次只打乱列表,然后取前 n 项:

Collections.shuffle(allMyColors);
List<Color> selected = allMyColors.stream().limit(n).collect(Collectors.toList());

这可能会更有效,因为它只随机化一次,除非颜色列表很长,在这种情况下可能应该避免随机播放。这在这里似乎不太可能。

也处理了n > allMyColors.size()的情况,因为limit会自动截断到流的长度。