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;
}
这里是思考过程:
- 创建支持变量 - 一个新的随机长度数组(小于 input.length)
- 用随机整数填充数组
- 删除重复项
- 在随机整数的索引处从输入数组中获取值
- 构建字符串和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));
正在寻找一种更有效的方法来 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;
}
这里是思考过程:
- 创建支持变量 - 一个新的随机长度数组(小于 input.length)
- 用随机整数填充数组
- 删除重复项
- 在随机整数的索引处从输入数组中获取值
- 构建字符串和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));