我有这个代码随机生成不同长度的数组(但根据我的需要使用特定项目)。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;
public class MarketBasketGeneratorAnon {
public static void main(String[] args) {
String[] elements = new String[]{"1", "2", "3", "4", "5", "6", "7","8"};
for (int i = 0; i < 99; i++) {
final String[] array = generateRandomArrayFromElements(elements);
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}
}
private static String[] generateRandomArrayFromElements(String[] elements) {
int size = ThreadLocalRandom.current().nextInt(1, elements.length) + 1;
String[] array = new String[size];
ArrayList<Integer> usedIndices = new ArrayList<>(size);
for (int i = 0; i < array.length; i++) {
int randomIndex = getUniqueRandomIndex(usedIndices, size);
usedIndices.add(randomIndex);
array[i] = elements[randomIndex];
}
return array;
}
private static int getUniqueRandomIndex(ArrayList<Integer> usedIndices, int max) {
int randomIndex = ThreadLocalRandom.current().nextInt(0, max);
final boolean contains = usedIndices.contains(randomIndex);
if (contains)
randomIndex = getUniqueRandomIndex(usedIndices, max);
return randomIndex;
}
}
在这种情况下,正如您所看到的,我正在生成100个阵列。
然后,我对每个数组中的元素进行排序。
在排序之后,当然许多这些数组变得相同,具有相同的长度和相同的项目。
我想从每组相同的数组中只打印一个,这样我只得到唯一的数组(没有重复的数组)。
如何编辑我的代码来实现这一目标?
谢谢!
答案 0 :(得分:0)
您可以将数组添加到Set
:这些容器不允许重复。
实际上,您无法直接添加数组,因为数组不会实现必要的方法,因此具有相同内容的两个数组被视为相等(equals
和hashCode
) ;但你可以将它们包装在一个数据结构中。
Set<List<String>> seenAlready = new HashSet<>();
// ...
for (int i = 0; i < 99; i++) {
final String[] array = generateRandomArrayFromElements(elements);
Arrays.sort(array);
if (seenAlready.add(Arrays.asList(array)) {
System.out.println(Arrays.toString(array));
}
}
如果参数不在集合中,则 Set.add
会返回true
。因此,仅当数组不在seenAlready
集中时才会打印数组;并且它将数组的列表表示添加到集合中,因此不会再次打印。