我想从不重复的数组中生成一个随机的设置字符串列表,不确定如何进行重复部分



这是我当时的代码重复,我该如何解决?

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));
        }
    }    
}

最新更新