总结帖子,没想到回复的朋友都是五星以上,小辈太荣幸了!哈哈
开心!使用Set去掉重复项,前提是该类必须有正确的.equals()和.hashCode(). 二者必须同时满足才行。我的equals()写的不好,hashCode()又不会写,所以使用了Eclipse自动生成。呵呵
/* (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((geneCode == null) ? 0 : geneCode.hashCode());
result = PRIME * result + (isElite ? 1231 : 1237);
result = PRIME * result + position;
return result;
}
然后就好用了!!!!谢谢大家!继续散分!!!我会努力加强基本功的!!!
原帖 http://community.csdn.net/Expert/topic/5191/5191858.xml?temp=1.534671E-02
内容:
如下
====================================================================按道理说,使用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;
}
}healer_kx(甘草{决心把CSDN改造成全国最大的文学爱好者的社区}) ( ) 信誉:100    Blog 用Set去承载他们,然后在用Set返回一个List
malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog 
猜测:equals有没有可能是特定接口的方法?要实现它?sg552(:)) ( ) 信誉:100    Blog 回复: healer_kx(甘草{决心把CSDN改造成全国最大的文学爱好者的社区}) ( 
--------------
用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   谢谢你的鼓励!!!gtlang78() ( ) 信誉:100    Blog 改写了equals()方法的类必须同时改写hashCode()方法,并且保证两个equal的对象它们的hashCode()方法的返回值也是相同的。否则的话这个类的对象放到 Hashtable, HashMap, HashSet等需要依赖hash值的容器类中的时候会出问题。treeroot(旗鲁特) ( ) 信誉:106    Blog 
楼上的正解最简单的实现
 return 0sg552(:)) ( ) 信誉:100    Blog 回复 malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog 
-------------------------
猜测:equals有没有可能是特定接口的方法?要实现它?
-------------------------
同意你的猜测,另外再猜测一下,是不是我写的equals方法不全面?因此导致了Set无法使用equals对我的自定义类进行判断是否有重复项?回复 treeroot(旗鲁特) ( ) 信誉:106    Blog 
----------------------
地球人都知道HashSet是基于HashMap的
TreeSet是基于TreeMap的
----------------------
前辈帮忙指点下啊!!!您说的太抽象了!!!
谢谢几位的回复!小人不才,发的帖子都是5级以上的高手来回复!!太荣幸了!
等下开新帖,加分!!!treeroot(旗鲁特) ( ) 信誉:106    Blog 哈希表提供最快的检索效率,只能精确检索, Object的hashCode方法就是专门为它设计的java中 Set实现都是基于Map的。TreeMap的数据结构是二叉树(红黑二叉树),是排序的集合。hashCode的实现原则:
 如果equals为true 保证hashCode相同,才能在HashMap中表现正常 不同的对象hashCode尽量不同