如何从2d数组中一次返回一个字符串,并且在使用完整个列表之前没有任何重复输出



我正在尝试制作一个从2d字符串数组中选择五个名称之一并返回的东西。我只想一次返回一个名称,所以我使用方法,但我也希望在生成所有名称之前,名称不要重复。我发现了一些几乎是我需要的东西。然而,输出仍然在一个列表中,如果我把它放在一个方法中,它就会重复。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Main {
static void runArray() {
String[] peoples = {"Person 1", "Person 2", "Person 3", "Person 4"};
List<String> names = Arrays.asList(peoples);
Collections.shuffle(names);
for (String name : names) {
System.out.println(name + " ");
}
}
public static void main(String[] args) {
runArray();
}
}

这样做的一种方法是,每次要处理名称时,从列表中随机删除一个项目,并在列表中还有更多名称时继续这样做。

例如

private static final Random R = new Random(System.currentTimeMillis());
private static String getRandomFromList(List<String> list) {
final int index = r.nextInt(list.size());
return list.remove(index);
}
private static void processName(String name) {
// do stuff here
}
public static void main(String[] args) {
final String[] peoples = {"Person 1", "Person 2", "Person 3", "Person 4"};
final List<String> names = Arrays.stream(peoples).collect(Collectors.toList());

while (!names.isEmpty()) {
final String name = getRandomFromList(names);
// Now do your processing for the name here e.g.
processName(name);
}
}

因此,您可以调用getRandomFromList4次(在上面的示例中(,每次都会得到一个随机名称,然后可以对其进行处理。我没有假设有特定数量的条目,而是将其放入while循环中,检查是否还有名称。

如果您需要按顺序调用它,您可以执行以下操作。最好确保列表中确实还有名字,如果没有,你可以写一个错误并提前返回,或者抛出一个异常。

if (names.isEmpty()) {
return; // or log error, or throw exception
}
String name = getRandomFromList(names);
// do stuff with first name
if (names.isEmpty()) {
return; // or log error, or throw exception
}
name = getRandomFromList(names);
// do stuff with second name
// etc.

最新更新