我有一些随机生成的数组:我怎样才能打印出独特的数组?

时间:2016-12-22 15:53:01

标签: java arrays

我有这个代码随机生成不同长度的数组(但根据我的需要使用特定项目)。

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个阵列。

然后,我对每个数组中的元素进行排序。

在排序之后,当然许多这些数组变得相同,具有相同的长度和相同的项目。

我想从每组相同的数组中只打印一个,这样我只得到唯一的数组(没有重复的数组)。

如何编辑我的代码来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将数组添加到Set:这些容器不允许重复。

实际上,您无法直接添加数组,因为数组不会实现必要的方法,因此具有相同内容的两个数组被视为相等(equalshashCode) ;但你可以将它们包装在一个数据结构中。

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集中时才会打印数组;并且它将数组的列表表示添加到集合中,因此不会再次打印。