我要到HashSet中添加10000个不同的数组,能指教下吗? 我要到HashSet中添加10000个不同的数组,那个能帮助下?提供下思路,最好能搞点代码什么的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼上你看这里http://topic.csdn.net/u/20110831/18/601e1eca-1ea1-4994-819e-b3a1570178ea.html,是问题的关键,我想你知道的 你认为数组内容相同,就表述数组相同?,如果是这样的话,你得重写hashcode方法 - -不是已经说的很明白了 重写hashCode和equals方法保证如果内容相同的话hashCode相同和equals返回true就行了 就是我随机产生数个长度相同的数组,例如:产生{1,2}{2,1}上面的数组,不一样,但储存的值是一样,我不想放入HashSet中。怎么避免或过滤? 那就稍微麻烦点。。hashCode可能好说点,你可以把每个Int值的hashCode得到,然后通过什么样的一堆运算返回一个hashCode值如果运算没有权重的话那么数组元素相同应该返回的值是相同的equals方法那你得两个for循环,遍历是否存在,而且你这种要判断相等还有个问题就是相同元素的个数,当然这是你自己制定规则,想怎么实现equals方法得根据你的规则来写 import java.util.HashSet;public class MySet extends HashSet{public int hashCode() { int h = 0; Iterator<E> i = iterator(); while (i.hasNext()) { E obj = i.next(); if (obj != null) h += obj.hashCode(); } return h; }}对吗? 大致意思是这样,不过你这里只能传Integer,泛型不支持原生数据类型 这样迭代出来的不是数组吗?obj.hashCode()不就是某个数组的哈希编码吗?这样好像不对呀? 给你写了一个实例,这里获取100个 MyArray,里面封装了长度为2的数组数据你改一下具体的参数就可以了,10000个我电脑跑的很慢import java.util.Arrays;import java.util.HashSet;import java.util.Set;//import java.util.Random;/** * Created by IntelliJ IDEA. * User: Administrator * Date: 2011-8-31 * Time: 20:09:35 * To change this template use File | Settings | File Templates. */public class MyArray { public int[] getNum() { return num; } private int[] num=null; public static MyArray getRandomInstance(){ return new MyArray(); } private MyArray(){ num=new int[2]; for(int i=0;i<num.length;i++){ num[i]= (int)(Math.random()*100); }// System.out.println(num[0]);// System.out.println(num[1]);// this.num=num; } /** * 如果数组长度不是2,可以用这个方法,同时重新toString方法 * @param aryLength */ private MyArray(int aryLength){ num=new int[aryLength]; for(int i=0;i<num.length;i++){ num[i]= (int)Math.random()*10; } } public String toString(){ return num[0]+","+num[1]; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof MyArray)) return false; MyArray myArray = (MyArray) o; if (!Arrays.equals(num, myArray.num)) return false; return true; } @Override public int hashCode() { return num != null ? Arrays.hashCode(num) : 0; } public static void main(String[] args){ Set<MyArray> set=new HashSet<MyArray>(); for(int i=0;set.size()<=100;i++){ set.add(MyArray.getRandomInstance());// System.out.println(i); } for(MyArray s:set){ System.out.println(s); } }} 迭代出来是数组中的每个对象,如果这些对象在你规则下hashCode值是相同的就行了,你也可以不用这样写撒不一定非得调用对象的hashCode值,比如如果是Integer你就直接把所有值加起来返回都可以hashSet里面添加的方法不是仅仅用到hashCode的,还要用equals 就按LS的思路,重写hashCode和equals,把随机生成的数组做个排序再比较public class Test { public static void main(String[] args) { Set<RandomArray> set = new HashSet<RandomArray>(); while (set.size() < 10000) { set.add(new RandomArray(3, 100)); } }}class RandomArray { private int[] array; public RandomArray(int len, int seed) { array = new int[Math.max(len, 0)]; for (int i=0; i<len; i++) { array[i] = (int)(Math.random()*seed); } } public boolean equals(Object o) { if (o != null && o.getClass() == RandomArray.class && o.getArray().length == array.length) { int[] a1 = Arrays.copyOf(array, array.length); int[] a2 = Arrays.copyOf(o.getArray(), o.getArray().length); Arrays.sort(a1); Arrays.sort(a2); return(Arrays.equals(a1, a2)); } return false; } public int hashCode() { int v = 0; for (int i=0; i<array.length; i++) { v += array[i]; } return v; } publit int[] getArray() {return array;}}不过10000个,效率可能有问题,用组合的方法把数组组合好,然后随机抽取10000个,可能会好一点public class Test { public static void main(String[] args) { List<List<Inteer>> list = combine(100, 3); Set<int[]> set = new HashSet<int[]>(); for (int i=0; i<10000; i++) { List<Integer> l = list.remove((int)(Math.random()*list.size())); int[] a = new int[l.size()]; for (int j=0; j<l.size(); j++) { a[j] = l.get(j); } set.add(a); } } public static List<List<Integer>> combine(int n, int m) { //从1到n的数中取m个数组合 if (m > n) {m = n;} int[] num = new int[n]; for (int i=0; i<n; i++) { num[i] = i+1; } int[] dig = new int[num.length]; for (int i=0; i<num.length; i++) { dig[i] = (i<num.length-m) ? 0 : 1; } List<List<Integer>> result = new LinkedList<List<Integer>>(); while (true) { int cnt=0, end=0; for (int i=0; i<dig.length; i++) { if (dig[i] == 1) { cnt++; if (i<m) {end++;} } } if (cnt == m) { List<Integer> list = new LinkedList<Integer>(); for (int i=0; i<num.length; i++) { if (dig[i] == 1) {list.add(num[i]);} } result.add(list); } if (end == m) {break;} dig[dig.length-1]++; for (int i=dig.length-1; i>0; i--) { if (dig[i] == 2) { dig[i] = 0; dig[i-1]++; } else { break; } } } return result; }} import java.util.*;class IntArray { int[] a; public IntArray(int[] a) { this.a = a; } public boolean equals(Object o) {//比较规则是:int[]型数组之间的每一个元素对应相等,两数组就相等 if (!(o instanceof IntArray)) {//如果对象类型不同,不是数组 return false; } IntArray temp = (IntArray) o; if (temp == null || temp.a.length != a.length) {//如果数组对象为空,或者长度不一致 return false; } for (int i = 0; i < a.length; i++) if (a[i] != temp.a[i]) {//如果至少有一对整数不相等 return false; } return true; } public String toString() { return Arrays.toString(a); } public int hashCode() {//重写hashcode方法 return a==null ? 0:a.length; }}public class TestOverrideHashcode { static Set<IntArray> set = new HashSet<IntArray>(); static void add(int[] a){ set.add(new IntArray(a)); } static void print() {//打印set中的信息 Iterator<IntArray> it = set.iterator(); while (it.hasNext()) {//现在无任何东西 System.out.println(it.next()); } } public static void main(String[] args) { print();//打印信息为空 add(new int[]{0,1}); add(new int[]{1,3}); add(new int[]{2,1}); add(new int[]{3,4}); //添加四个不同的数组打印信息 System.out.println("第一次打印:"); print(); add(new int[]{0,1}); add(new int[]{1,3}); add(new int[]{2,1}); add(new int[]{3,4}); //添加与上面个“相同”的数组打印信息,这里的相同是数组的内容对应相同,而不是内存地址相同 System.out.println("第二次打印:"); print();//结果跟上面一摸一样 for(int i=0; i<10000;i++) { add(new int[]{i,i}); } System.out.println("此时set中元素个数:" + set.size()); for(int i=0; i<10000;i++) { add(new int[]{i,i}); } System.out.println("添加1000个‘重复元素’后,此时set中元素个数:" + set.size()); }}/*output:第一次打印:[3, 4][2, 1][1, 3][0, 1]第二次打印:[3, 4][2, 1][1, 3][0, 1]此时set中元素个数:10004添加1000个‘重复元素’后,此时set中元素个数:10004*/ public boolean equals(Object o) {//比较规则是:int[]型数组之间的每一个元素对应相等,两数组就相等 if (!(o instanceof IntArray)) {//如果对象类型不同,不是数组 return false; } IntArray temp = (IntArray) o; if (temp == null || temp.a.length != a.length) {//如果数组对象为空,或者长度不一致 return false; }Arrays.sort(a); Arrays.sort(temp); for (int i = 0; i < a.length; i++) if (a[i] != temp.a[i]) {//如果至少有一对整数不相等 return false; } return true; }楼上的增加红色部分就可以,过滤数组内容相同,顺序不同的数组了。谢谢各位了。 Arrays.sort(a); Arrays.sort(temp);修改为Arrays.sort(a); Arrays.sort(temp.a); 如果你不在乎数组中元素的顺序,你就把红色部分添加到for循环之前吧 Jbuilder 2006运用 新手请教poi中能否根据cell名称取得cell Checkbox问题 求救:java程序打包后无法正常运行 import后有问题 String 转化为 Integer java.lang.NumberFormatException: For input string: "22" 如何利用代理服务器,在内网发送邮件 JPad Pro help!!!!!(online) 请问如何收回线程所占的资源 請問一下各位大蝦,哪有visio下載 swt 网页浏览FlashPlayer遇到的问题 求线程高人指点
重写hashCode和equals方法保证如果内容相同的话hashCode相同和equals返回true就行了
上面的数组,不一样,但储存的值是一样,我不想放入HashSet中。怎么避免或过滤?
hashCode可能好说点,你可以把每个Int值的hashCode得到,然后通过什么样的一堆运算返回一个hashCode值
如果运算没有权重的话那么数组元素相同应该返回的值是相同的
equals方法那你得两个for循环,遍历是否存在,而且你这种要判断相等还有个问题就是相同元素的个数,当然这是你自己制定规则,想怎么实现equals方法得根据你的规则来写
import java.util.HashSet;
public class MySet extends HashSet{
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}}
对吗?
obj.hashCode()不就是某个数组的哈希编码吗?
这样好像不对呀?
你改一下具体的参数就可以了,10000个我电脑跑的很慢
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;//import java.util.Random;/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2011-8-31
* Time: 20:09:35
* To change this template use File | Settings | File Templates.
*/
public class MyArray { public int[] getNum() {
return num;
} private int[] num=null; public static MyArray getRandomInstance(){
return new MyArray();
} private MyArray(){
num=new int[2];
for(int i=0;i<num.length;i++){
num[i]= (int)(Math.random()*100);
}
// System.out.println(num[0]);
// System.out.println(num[1]);
// this.num=num; } /**
* 如果数组长度不是2,可以用这个方法,同时重新toString方法
* @param aryLength
*/
private MyArray(int aryLength){
num=new int[aryLength];
for(int i=0;i<num.length;i++){
num[i]= (int)Math.random()*10;
} }
public String toString(){
return num[0]+","+num[1];
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyArray)) return false; MyArray myArray = (MyArray) o; if (!Arrays.equals(num, myArray.num)) return false; return true;
} @Override
public int hashCode() {
return num != null ? Arrays.hashCode(num) : 0;
} public static void main(String[] args){
Set<MyArray> set=new HashSet<MyArray>();
for(int i=0;set.size()<=100;i++){
set.add(MyArray.getRandomInstance());
// System.out.println(i);
} for(MyArray s:set){
System.out.println(s);
}
}
}
不一定非得调用对象的hashCode值,比如如果是Integer你就直接把所有值加起来返回都可以
hashSet里面添加的方法不是仅仅用到hashCode的,还要用equals
public class Test {
public static void main(String[] args) {
Set<RandomArray> set = new HashSet<RandomArray>();
while (set.size() < 10000) {
set.add(new RandomArray(3, 100));
}
}
}class RandomArray {
private int[] array;
public RandomArray(int len, int seed) {
array = new int[Math.max(len, 0)];
for (int i=0; i<len; i++) {
array[i] = (int)(Math.random()*seed);
}
}
public boolean equals(Object o) {
if (o != null &&
o.getClass() == RandomArray.class &&
o.getArray().length == array.length) {
int[] a1 = Arrays.copyOf(array, array.length);
int[] a2 = Arrays.copyOf(o.getArray(), o.getArray().length);
Arrays.sort(a1);
Arrays.sort(a2);
return(Arrays.equals(a1, a2));
}
return false;
}
public int hashCode() {
int v = 0;
for (int i=0; i<array.length; i++) {
v += array[i];
}
return v;
}
publit int[] getArray() {return array;}
}
不过10000个,效率可能有问题,用组合的方法把数组组合好,然后随机抽取10000个,可能会好一点
public class Test {
public static void main(String[] args) {
List<List<Inteer>> list = combine(100, 3);
Set<int[]> set = new HashSet<int[]>();
for (int i=0; i<10000; i++) {
List<Integer> l = list.remove((int)(Math.random()*list.size()));
int[] a = new int[l.size()];
for (int j=0; j<l.size(); j++) {
a[j] = l.get(j);
}
set.add(a);
}
} public static List<List<Integer>> combine(int n, int m) { //从1到n的数中取m个数组合
if (m > n) {m = n;}
int[] num = new int[n];
for (int i=0; i<n; i++) {
num[i] = i+1;
}
int[] dig = new int[num.length];
for (int i=0; i<num.length; i++) {
dig[i] = (i<num.length-m) ? 0 : 1;
}
List<List<Integer>> result = new LinkedList<List<Integer>>();
while (true) {
int cnt=0, end=0;
for (int i=0; i<dig.length; i++) {
if (dig[i] == 1) {
cnt++;
if (i<m) {end++;}
}
}
if (cnt == m) {
List<Integer> list = new LinkedList<Integer>();
for (int i=0; i<num.length; i++) {
if (dig[i] == 1) {list.add(num[i]);}
}
result.add(list);
}
if (end == m) {break;} dig[dig.length-1]++;
for (int i=dig.length-1; i>0; i--) {
if (dig[i] == 2) {
dig[i] = 0;
dig[i-1]++;
} else {
break;
}
}
}
return result;
}
}
import java.util.*;
class IntArray {
int[] a;
public IntArray(int[] a) {
this.a = a;
}
public boolean equals(Object o) {//比较规则是:int[]型数组之间的每一个元素对应相等,两数组就相等
if (!(o instanceof IntArray)) {//如果对象类型不同,不是数组
return false;
}
IntArray temp = (IntArray) o;
if (temp == null || temp.a.length != a.length) {//如果数组对象为空,或者长度不一致
return false;
}
for (int i = 0; i < a.length; i++)
if (a[i] != temp.a[i]) {//如果至少有一对整数不相等
return false;
}
return true;
}
public String toString() {
return Arrays.toString(a);
}
public int hashCode() {//重写hashcode方法
return a==null ? 0:a.length;
}
}public class TestOverrideHashcode {
static Set<IntArray> set = new HashSet<IntArray>();
static void add(int[] a){
set.add(new IntArray(a));
}
static void print() {//打印set中的信息
Iterator<IntArray> it = set.iterator();
while (it.hasNext()) {//现在无任何东西
System.out.println(it.next());
}
}
public static void main(String[] args) {
print();//打印信息为空
add(new int[]{0,1});
add(new int[]{1,3});
add(new int[]{2,1});
add(new int[]{3,4}); //添加四个不同的数组打印信息
System.out.println("第一次打印:");
print();
add(new int[]{0,1});
add(new int[]{1,3});
add(new int[]{2,1});
add(new int[]{3,4});
//添加与上面个“相同”的数组打印信息,这里的相同是数组的内容对应相同,而不是内存地址相同
System.out.println("第二次打印:");
print();//结果跟上面一摸一样 for(int i=0; i<10000;i++) {
add(new int[]{i,i});
}
System.out.println("此时set中元素个数:" + set.size()); for(int i=0; i<10000;i++) {
add(new int[]{i,i});
}
System.out.println("添加1000个‘重复元素’后,此时set中元素个数:" + set.size());
}
}
/*output:
第一次打印:
[3, 4]
[2, 1]
[1, 3]
[0, 1]
第二次打印:
[3, 4]
[2, 1]
[1, 3]
[0, 1]
此时set中元素个数:10004
添加1000个‘重复元素’后,此时set中元素个数:10004
*/
if (!(o instanceof IntArray)) {//如果对象类型不同,不是数组
return false;
}
IntArray temp = (IntArray) o;
if (temp == null || temp.a.length != a.length) {//如果数组对象为空,或者长度不一致
return false;
}
Arrays.sort(a);
Arrays.sort(temp);
for (int i = 0; i < a.length; i++)
if (a[i] != temp.a[i]) {//如果至少有一对整数不相等
return false;
}
return true;
}
楼上的增加红色部分就可以,过滤数组内容相同,顺序不同的数组了。
谢谢各位了。
Arrays.sort(temp);
修改为Arrays.sort(a);
Arrays.sort(temp.a);