Java 从不重复的字符串数组中 select 随机子集的最佳方法

Java best way to select random subset from an array of strings with no duplicates

正在寻找一种更有效的方法来 select 字符串数组中的随机元素子集(无重复项)。

public static String randomReturnArray(String inputArray[]) {

    String[] tmpInputArr = Arrays.copyOf(inputArray, inputArray.length);

    Random r = new Random();
    int inMin = 0;
    int inMax = inputArray.length;
    int numOfMarkings = r.nextInt((inMax - inMin) + 1) + inMin;
    int[] arrOfInputIndexes = new int[numOfMarkings];

    for (int d = 0; d < numOfMarkings; d++) {
        Random f = new Random();
        int index = f.nextInt(inputArray.length);
        arrOfInputIndexes[d] = index;
    }

    for (int i = 0; i < arrOfInputIndexes.length - 1; i++) {
        for (int j = i + 1; j < arrOfInputIndexes.length; j++) {
            if (arrOfInputIndexes[i] == arrOfInputIndexes[j]) {
                arrOfInputIndexes = ArrayUtils.remove(arrOfInputIndexes, j);
            }
        }
    }

    String[] finalArray = new String[arrOfInputIndexes.length];
    for (int l = 0; l < arrOfInputIndexes.length; l++) {
        int temp = arrOfInputIndexes[l];
        finalArray[l] = tmpInputArr[temp];
    }

    StringBuilder builder = new StringBuilder();
    for (String marking : finalArray) {
        builder.append(marking);
        builder.append(" ");
    }
    String finalArray = builder.toString();

    return finalArray;
} 

这里是思考过程:

  1. 创建支持变量 - 一个新的随机长度数组(小于 input.length)
  2. 用随机整数填充数组
  3. 删除重复项
  4. 在随机整数的索引处从输入数组中获取值
  5. 构建字符串和return

非常感谢。

您可以使用 Collections.shuffle 正是为了这些目的。

例如:

String[] strings = new String[] {
     "foo", "bar", "toto", "fox", "koukou", "bar", "Bar" 
} ;

// Filter-out duplicates, then shuffle
final List<String> stringsList = Arrays.stream(strings)
    .distinct().collect(Collectors.toList());
Collections.shuffle(stringsList);
// Take a sample
final int k = 3; // the sample size
List<String> sample = stringsList.subList(0, k); // this is a view, not another list
System.err.println(sample);

如果我们不关心重复,事情会更简单一些,可以对原始数组进行洗牌(然后,我们可以只选择前 k 个元素):

Collections.shuffle(Arrays.asList(strings));