在Java中维护唯一数组的ArrayList

Din*_*ero 16 java arraylist

如何维护ArrayList唯一数组?

例如,如果我有以下数组:

int [] a = {1,2,3};
int [] b = {2,1,3};
int [] c = {2,1,3};
Run Code Online (Sandbox Code Playgroud)

根据我的逻辑,我正在考虑独特的组合。因此,在上述情况下a = b = c,因为它们都含有"1""2""3"

理想情况下,我想知道Java中是否有可以识别这一点的数据结构。

我尝试了以下方法:

Set<int []> result = new LinkedHashSet<>();
int [] x = {1,2,3};
int [] z = {2,1,3};
int [] m = {2,1,3};

result.add(x);
result.add(z);
result.add(m);

for(int [] arr: result){
    printArray(arr);
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:

1 2 3
2 1 3
2 1 3
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望我的输出仅打印上述组合之一。

YCF*_*F_L 5

您可以创建一个方法来添加,如果不等于这样:

public static Set<int[]> addIfNotExist(Set<int[]> result, int[] array) {
    boolean check = result.stream()
            .anyMatch(a -> {
                Arrays.sort(a);
                Arrays.sort(array);
                return Arrays.equals(a, array);
            });
    if (check) {
        return result;
    } else {
        result.add(array);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样调用方法:

result = addIfNotExist(result, x);
result = addIfNotExist(result, z);
result = addIfNotExist(result, m);
Run Code Online (Sandbox Code Playgroud)

输出量

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用static Set,则可以使用:

static Set<int[]> result = new LinkedHashSet<>();

public static void main(String[] args) {

    int[] x = {1, 2, 3};
    int[] z = {2, 1, 3};
    int[] m = {2, 1, 3};

    addIfNotExist(result, x);
    addIfNotExist(result, z);
    addIfNotExist(result, m);

    for (int[] arr : result) {
        System.out.println(Arrays.toString(arr));
    }
}

public static void addIfNotExist(Set<int[]> result, int[] array) {
    boolean check = result.stream()
            .anyMatch(a -> {
                Arrays.sort(a);
                Arrays.sort(array);
                return Arrays.equals(a, array);
            });
    if (!check) {
        result.add(array);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*vin 5

确实感觉很hacky和错误,但是您可以将a TreeSet与custom结合使用Comparator。根据您的需求,这实际上可能有效,但是至少请注意,这违反了Set接口的常规协定。

class Demo {
    public static void main(String[] args) throws Exception {
        Set<int[]> result = new TreeSet<>(new Hack());
        int[] x = {1,2,3};
        int[] z = {2,1,3};
        int[] m = {2,1,3};

        result.add(x);
        result.add(z);
        result.add(m);

        for (int[] arr : result) {
            System.out.println(Arrays.toString(arr));
        }
    }
}

class Hack implements Comparator<int[]> {

    @Override
    public int compare(int[] e1, int[] e2) {
        int[] copy1 = Arrays.copyOf(e1, e1.length);
        int[] copy2 = Arrays.copyOf(e2, e2.length);
        Arrays.sort(copy1);
        Arrays.sort(copy2);
        return Arrays.compare(copy1, copy2);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

如果您仍在使用Java 8,请使用以下Hack实现:

class Hack implements Comparator<int[]> {

    @Override
    public int compare(int[] e1, int[] e2) {
        int[] copy1 = Arrays.copyOf(e1, e1.length);
        int[] copy2 = Arrays.copyOf(e2, e2.length);
        Arrays.sort(copy1);
        Arrays.sort(copy2);
        int cmp = Integer.compare(copy1.length, copy2.length);
        if (cmp != 0) {
            return cmp;
        }
        for (int i = 0; i < copy1.length; i++) {
            cmp = Integer.compare(copy1[i], copy2[i]);
            if (cmp != 0) {
                return cmp;
            }
        }
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)