按道理说,使用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;
}
}

解决方案 »

  1.   

    用Set去承载他们,然后在用Set返回一个List
      

  2.   

    debug一下,跟踪看看问题出在哪吧。
    应该是你的程序问题
      

  3.   

    我找到另外的东西, 大家看看有帮助吗???HashSet:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看HashSet的add(Object  obj)方法的实现就可以一目了然了。    public boolean add(Object obj)
        {
            return map.put(obj, PRESENT) == null;
        }这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
      

  4.   

    Set set = new HashSet();
    set.add(gene1);
    set.add(gene2);
    set.add(gene3);
    List list = new ArrayList(set);
      

  5.   

    地球人都知道HashSet是基于HashMap的
    TreeSet是基于TreeMap的
      

  6.   

    猜测:equals有没有可能是特定接口的方法?要实现它?
      

  7.   

    回复: 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   谢谢你的鼓励!!!
      

  8.   

    改写了equals()方法的类必须同时改写hashCode()方法,并且保证两个equal的对象它们的hashCode()方法的返回值也是相同的。否则的话这个类的对象放到 Hashtable, HashMap, HashSet等需要依赖hash值的容器类中的时候会出问题。
      

  9.   

    最简单的实现
     return 0
      

  10.   

    回复 malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog 
    -------------------------
    猜测:equals有没有可能是特定接口的方法?要实现它?
    -------------------------
    同意你的猜测,另外再猜测一下,是不是我写的equals方法不全面?因此导致了Set无法使用equals对我的自定义类进行判断是否有重复项?回复 treeroot(旗鲁特) ( ) 信誉:106    Blog 
    ----------------------
    地球人都知道HashSet是基于HashMap的
    TreeSet是基于TreeMap的
    ----------------------
    前辈帮忙指点下啊!!!您说的太抽象了!!!
    谢谢几位的回复!小人不才,发的帖子都是5级以上的高手来回复!!太荣幸了!
    等下开新帖,加分!!!
      

  11.   

    感谢大家!!!先给分!!!我再去重栽 hashCode()!!!分数觉得给的少,欢迎大家等下来总结帖子接分!!!
      

  12.   

    哈希表提供最快的检索效率,只能精确检索, Object的hashCode方法就是专门为它设计的java中 Set实现都是基于Map的。TreeMap的数据结构是二叉树(红黑二叉树),是排序的集合。
      

  13.   

    hashCode的实现原则:
     如果equals为true 保证hashCode相同,才能在HashMap中表现正常 不同的对象hashCode尽量不同
      

  14.   

    用Hashtable不就得了,干嘛自己实现呢?
      

  15.   

    还得重载Object的hashcode()要不两个对象取hashcode的时候取的是对象在内存中的地址,并且如果类中的属性不是基本类型/包装类和String那么他也要实现equals()和hashcode()
      

  16.   

    要把list转成xml Document对象,然后就可以直接对xml查询了.如果有重复的,就delete it.
      

  17.   

    搂主忽略了一个问题,并不是你只设置了equals就行了,你的类还要实现Comparable接口,重写compareTo方法,然后试试看是否可以删除重复。
      

  18.   

    你写的那个自定义的类除了重写了equals方法之外,还需要重写hashCode方法,并且当equals方法相等时他们的哈希玛也完全相等,否则就不能正常工作。因为你测试的那些基本类型的包装类已经完成了这些方法的重写,所以当然不存在你上面说的那个问题。其实这个问题很基础
      

  19.   

    myyate(yate) ( ) 信誉:99    Blog  2006-11-30 11:15:38  得分: 0  
     
     
       搂主忽略了一个问题,并不是你只设置了equals就行了,你的类还要实现Comparable接口,重写compareTo方法,然后试试看是否可以删除重复。  
     
    这才是关键!!!!!!!!!!!!!!!!!!!!!!!!!
      

  20.   

    wangzh0098 说的正确  Both equals and hashCode are needed <<thinking in java>> 
    上有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;
      

  21.   

    gtlang78() ( ) 信誉:100    Blog  2006-11-28 17:51:14  得分: 50  
     
     
       
    改写了equals()方法的类必须同时改写hashCode()方法,并且保证两个equal的对象它们的hashCode()方法的返回值也是相同的。否则的话这个类的对象放到 Hashtable, HashMap, HashSet等需要依赖hash值的容器类中的时候会出问题。  --------------------------
    答案就这样.改写了equals()方法的类必须同时改写hashCode()方法,