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
会自动截断到流的长度。
我正在尝试将其作为输出:
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
会自动截断到流的长度。