这是我当时的代码重复,我该如何解决?
public static void main(String arg[]){
//Object to get user input
Scanner in = new Scanner(System.in);
//String array
String[] strings = {"Kelder", "Slotgracht", "Raadsheer", "Dorp", "Militie", "Werkplaats", "Bureaucraat", "Feest", "Tuin", "Houthakker", "Geldschieter", "Verbouwing", "Smidse", "Spion", "Dief", "Troonzaal", "Raadszaal", "Festival", "Laboratorium", "Bibliotheek", "Markt", "Mijn", "Heks", "Avonturier"};
System.out.print("Hoeveel kaarten wil je?: ");
//Get user input
int numberOfTest = in.nextInt();
for(int i = 0; i < numberOfTest; i++){
int index = (int)(Math.random() * 10);
System.out.println(strings[index]);
}
}
您可以做到这一点:
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String arg[]){
//Object to get user input
Scanner in = new Scanner(System.in);
//String array
String[] strings = {"Kelder", "Slotgracht", "Raadsheer", "Dorp", "Militie", "Werkplaats", "Bureaucraat", "Feest", "Tuin", "Houthakker", "Geldschieter", "Verbouwing", "Smidse", "Spion", "Dief", "Troonzaal", "Raadszaal", "Festival", "Laboratorium", "Bibliotheek", "Markt", "Mijn", "Heks", "Avonturier"};
// ArrayList to store string selected already
ArrayList<String> selectedBefore = new ArrayList<String>();
System.out.print("Hoeveel kaarten wil je?: ");
//Get user input
int numberOfTest = in.nextInt();
for(int i = 0; i < numberOfTest; i++){
int index = (int)(Math.random() * strings.length);
// Keep checking if the string has been selected before
while(selectedBefore.contains(strings[index]))
{
index = (int)(Math.random() * strings.length);
}
//store the string that was selected by Math.random() before:
selectedBefore.add(strings[index]);
System.out.println(strings[index]);
}
}
}
此解决方案不会改变您的原始代码结构的太多,但添加了:
selectedbefore之前的arraylist可以帮助存储已经选择的字符串。
a时循环以继续检查字符串是否以前已选择,如果有的话,请随机选择一个新索引,直到选择以前从未选择的索引。由于这是一个小列表,因此该算法效果很好,如果它是一个很大的列表,它将达到程序的性能,您需要更改程序的算法。
您可能还需要将用户输入限制为字符串阵列中可用的最大数字,以免索引出现在限制的异常中。
此外,您还可以以这种方式初始化阵列列表以节省内存,因为您知道它的大小将等于字符串数组的长度:
ArrayList<String> selectedBefore = new ArrayList<String>(strings.length);
而不是在先前未经编辑的答案中:
ArrayList<String> selectedBefore = new ArrayList<String>();
这是MC皇帝建议的示例:
public static void main(String [] args) {
List<String> strings = Arrays.asList("Kelder", "Slotgracht", "Raadsheer", "Dorp", "Militie", "Werkplaats", "Bureaucraat", "Feest", "Tuin", "Houthakker", "Geldschieter", "Verbouwing", "Smidse", "Spion", "Dief", "Troonzaal", "Raadszaal", "Festival", "Laboratorium", "Bibliotheek", "Markt", "Mijn", "Heks", "Avonturier");
Collections.shuffle(strings);
Scanner in = new Scanner(System.in);
System.out.print("Hoeveel kaarten wil je?: ");
int numberOfTest = in.nextInt();
if (numberOfTest >= 0 && numberOfTest < strings.size()) {
for(int i = 0; i < numberOfTest; i++){
System.out.println(strings.get(i));
}
}
}