java 将int类型数组存入Set集合中

int[] arr1={10,12,15};
int[] arr2={10,12,15};
Set<int[]> set=new HashSet<int[]>();
set.add(arr1);
set.add(arr2);
Iterator ite=set.iterator();
while(ite.hasNext()){
System.out.println(Arrays.toString(((int[])ite.next())));
}
打印结果为[10, 12, 15] [10, 12, 15]
请问如何去重

arr1和arr2是数组,arr1和arr2存放的是你这两个数组的内存地址,直接放入set是无法自动去重的,因为他们的内存地址不一样
如果他们的长度一样,还是手动去重吧
方法:
遍历set,挨个比较要被放入的数组,若已存在,则不放入追问

额,这样岂不是很蛋疼......
每次存之前还要用Iterator遍历,遍历后还要用for循环进行元素的比对....太复杂了,我等等看有没有更好的方法。

追答

int[] arr1={10,12,15};
int[] arr2={10,15,12};
算是重的吗?

追问

不算,但这个是不是我要的目的,我会对数组进行sort()排序,现在只讨论元素的值一样的情况怎么排重

追答

仔细想了一下你这个确实不重写hashcode, 或者不重写comapreto很难实现
至于你说的像楼下重新定义一个数组很麻烦的话,你直接定义一个有3个int属性的数据类来代替这个int数组算了,其实用的空间是一样的,都是一个地址加3个int型变量的空间,就不用再包装成数据类了

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-01
因为arr1 == arr2 ---.> false
HashSet, 你这个很难实现的,用TreeSet然后重写compareTo可以实现通过Set来驱重

TreeSet实现方案
import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Ts {

/**
* @param args
*/
public static void main(String[] args) {

int[] arr1 = { 10, 12, 15 };
int[] arr2 = { 10, 12, 15 };

IntAry ary1 = new IntAry(arr1);
IntAry ary2 = new IntAry(arr2);

Set<IntAry> set = new TreeSet<IntAry>();
set.add(ary1);
set.add(ary2);

Iterator ite = set.iterator();
while (ite.hasNext()) {

System.out.println(Arrays.toString(((IntAry)ite.next()).getAry()));
}

}

}

class IntAry implements Comparable<IntAry>{
private int[] ary = null;

public IntAry(int[] ary){
this.ary = ary;
}

public int[] getAry(){
return ary;
}

public int compareTo(IntAry obj) {
int[] o = obj.getAry();
if(o.length != ary.length){
return -1;
}

for(int i = 0; i < ary.length; i++){
if(ary[i] != o[i]){
return -1;
}
}

return 0;
}

//HashSet, seems impossible
// public int hashCode() {
//
// return super.hashCode();
// }
//
}追问

额 重新定义一个数组类,你这个麻烦程度也不可小觑....
坐等更好的答案。

追答

不重写hashcode, 或者不重写comapreto这个应该实现不到的

追问

集思广益,看看有没有高人帮忙解答下。

追答

HashSet实现,利用相同数组.toString()得hashcode一样,必须要重写hashcode,单int[]不可能的
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Ts {

/**
* @param args
*/
public static void main(String[] args) {

int[] arr1 = { 10, 12, 15 };
int[] arr2 = { 10, 12, 15 };

IntAryHash aryHash1 = new IntAryHash(arr1);
IntAryHash aryHash2 = new IntAryHash(arr2);

Set set = new HashSet();

set.add(aryHash1);
set.add(aryHash2);

Iterator ite = set.iterator();
while (ite.hasNext()) {
System.out.println(Arrays.toString(((IntAryHash)ite.next()).getAry()));
}

}

}

class IntAryHash{
private int[] ary ;

public IntAryHash(int[] ary){
this.ary =ary;
}

public int hashCode() {
return Arrays.toString(ary).hashCode();
}

public int[] getAry(){
return ary;
}

public boolean equals(Object o) {
return o.hashCode() == this.hashCode();
}

}

本回答被网友采纳
第2个回答  推荐于2016-08-16
public static void main(String[] args) {
int[] a={1,2,3};
int[] b={2,3,1};
Arrays.sort(b);
System.out.println(Arrays.toString(a).equals(Arrays.toString(b)));
}
如果楼主每个数组都排序的话,你可以用Arrays.toString(a)将里面的数组转换成String用String的equals判断下就能找到了.
这样的话,你写一个很简单的方法遍历下不就行了,不存在再存,存在就不存了 .
貌似也没什么好的方法了本回答被提问者采纳
第3个回答  2012-02-28
说清楚追问

在set中存入长度一样的 int 类型数组,如何去除里面值一样的数组。
int[] arr1={10,12,15};
int[] arr2={10,12,15};
这两个长度和元素都一样,存入set中如何去掉重复。

第4个回答  2021-12-15
如果你的数组时固定大小,你可以试着把数组转成int(Integer)存入,再去container比较。
相似回答