按道理说,使用java.util.Set可以去掉重复的,
我用了一下,可以去掉String,int等java.lang包中的类型,但是现在的问题是,我自己定义的一个类Gene,不能通过
放到Set中而去重复。我查看了英文的JAVA API,也看了中文的(翻译的真烂),里面
说只要待加入的项,跟集合中已经存在的项.equals()==true,
那么就不会把该项加进去。(原文是:
More formally, adds the specified element, o, to this set if this set contains no element e such that (o==null ? e==null : o.equals(e)). If this set already contains the specified element, the call leaves this set unchanged and returns false.)我的自定义的Gene类,已经实现了equals()方法。但是
为什么还不行呢?难道是我的equals()方法写错了吗?附表:Gene的equals方法与成员 //基因代码
private String geneCode;
//在染色体中的位置
private int position;
//是否是精英
private boolean isElite;
/**
* 比较两个基因是否相同
*/
public boolean equals(Object anObject) {
String geneCode=((Gene)anObject).getGeneCode();
int position=((Gene)anObject).getPosition();
boolean isElite=((Gene)anObject).isElite();
if(this.geneCode.equals(geneCode)&&
this.position==position&&
this.isElite==isElite){
return true;
}else{
return false;
}
}
我用了一下,可以去掉String,int等java.lang包中的类型,但是现在的问题是,我自己定义的一个类Gene,不能通过
放到Set中而去重复。我查看了英文的JAVA API,也看了中文的(翻译的真烂),里面
说只要待加入的项,跟集合中已经存在的项.equals()==true,
那么就不会把该项加进去。(原文是:
More formally, adds the specified element, o, to this set if this set contains no element e such that (o==null ? e==null : o.equals(e)). If this set already contains the specified element, the call leaves this set unchanged and returns false.)我的自定义的Gene类,已经实现了equals()方法。但是
为什么还不行呢?难道是我的equals()方法写错了吗?附表:Gene的equals方法与成员 //基因代码
private String geneCode;
//在染色体中的位置
private int position;
//是否是精英
private boolean isElite;
/**
* 比较两个基因是否相同
*/
public boolean equals(Object anObject) {
String geneCode=((Gene)anObject).getGeneCode();
int position=((Gene)anObject).getPosition();
boolean isElite=((Gene)anObject).isElite();
if(this.geneCode.equals(geneCode)&&
this.position==position&&
this.isElite==isElite){
return true;
}else{
return false;
}
}
解决方案 »
- 怎么用system.in来读取多个数值
- 加分了 《---继续请教 如何随机挑选数组中的元素,而且保证每个元素都被选过 请问 paullbm 还在吗 ---》
- 关于一个字符处理的问题
- 怎么才能快速比较字符串,取出分隔符最后的字符
- 有哪位用vb或者其他语言做过测温系统,使用access数据库保存温度值
- 100分求一个简单的“类”的小问题,在线等待,立即给分!
- 后台用system.out输出占用的资源多不多
- 关于.properties文件的问题!
- ERP都是用Java开发的吗?
- Integer的值怎么改变?(不想指向其他对象)
- 一个关于JAVA字符串的问题!哪位大哥给小弟解答下,给30分哦
- 一个技术难题,实在是不会了,希望好心人帮忙!!!
应该是你的程序问题
{
return map.put(obj, PRESENT) == null;
}这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
set.add(gene1);
set.add(gene2);
set.add(gene3);
List list = new ArrayList(set);
TreeSet是基于TreeMap的
--------------
用Set去承载他们,然后在用Set返回一个List
--------------
你说的这个,是不是这样?
Set<Gene> tempSet=new HashSet<Gene>(tempList);
Gene[] temp=tempSet.toArray(new Gene[tempSet.size()]);
s2=Arrays.asList(temp);我试过了,不行。去掉不了我自定义的类的重复项
回复:masse(当午) ( ) 信誉:100 Blog
--------------
debug一下,跟踪看看问题出在哪吧。
应该是你的程序问题
--------------
debug了一下午了。T T 发现Set可以去掉String这样的类型的重复项,但是却不能去掉我自己定义的重复项目,我的DEBUG的片段是这样写的:(为了验证两个同样内容,equals()==true的两个类,能否增加到Set中)
Gene gene1=new Gene("111",1,true);
Gene gene2=new Gene("111",1,true);
Set<Gene> set2=new HashSet<Gene>();
logger.debug("set2.add(gene1)?"+set2.add(gene1)); // true
logger.debug("set2.add(gene1)?"+set2.add(gene1)); // false
logger.debug("set2.add(gene2)?"+set2.add(gene2)); // true !!??
logger.debug("gene1.equals(gene2)? "+gene1.equals(gene2)); //true
结果是:
[main] DEBUG ray.force.genetic.algorithm.TestSet - set2.add(gene1)?true
[main] DEBUG ray.force.genetic.algorithm.TestSet - set2.add(gene1)?false
[main] DEBUG ray.force.genetic.algorithm.TestSet - set2.add(gene2)?true
[main] DEBUG ray.force.genetic.algorithm.TestSet - gene1.equals(gene2)? true回复: treeroot(旗鲁特) ( ) 信誉:106 Blog 谢谢你的鼓励!!!
return 0
-------------------------
猜测:equals有没有可能是特定接口的方法?要实现它?
-------------------------
同意你的猜测,另外再猜测一下,是不是我写的equals方法不全面?因此导致了Set无法使用equals对我的自定义类进行判断是否有重复项?回复 treeroot(旗鲁特) ( ) 信誉:106 Blog
----------------------
地球人都知道HashSet是基于HashMap的
TreeSet是基于TreeMap的
----------------------
前辈帮忙指点下啊!!!您说的太抽象了!!!
谢谢几位的回复!小人不才,发的帖子都是5级以上的高手来回复!!太荣幸了!
等下开新帖,加分!!!
如果equals为true 保证hashCode相同,才能在HashMap中表现正常 不同的对象hashCode尽量不同
搂主忽略了一个问题,并不是你只设置了equals就行了,你的类还要实现Comparable接口,重写compareTo方法,然后试试看是否可以删除重复。
这才是关键!!!!!!!!!!!!!!!!!!!!!!!!!
上有hashCode重载的方法,可以根据不同类型给出公式Field type Calculation
boolean c = (f ? 0 : 1)
byte,char,short,int c = (int)f
long c = (int)(f^f>>>32))
float c = Float.floatToIntBits(f)
double long l = Double.doubleToLongBits(f)
c = (int)(l^(l >>> 32))
Object c = f.hashCode()
Array Apply above rules to each element
int Result = 17
Result = 37 * Result + c
return Result;
改写了equals()方法的类必须同时改写hashCode()方法,并且保证两个equal的对象它们的hashCode()方法的返回值也是相同的。否则的话这个类的对象放到 Hashtable, HashMap, HashSet等需要依赖hash值的容器类中的时候会出问题。 --------------------------
答案就这样.改写了equals()方法的类必须同时改写hashCode()方法,