如何维护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)
理想情况下,我希望我的输出仅打印上述组合之一。
您可以创建一个方法来添加,如果不等于这样:
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)
确实感觉很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)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |