teamojiao 2009-06-04 22:37
浏览 155
已采纳

关于集合类运用Comparator排序的问题!

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;


class User {
    
    private String name;
    private String age;
    private String grade;
    public User(String name, String age, String grade) {
        super();
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getGrade() {
        return grade;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }
    
    public String toString(){
        return name+"["+age+"] :"+grade;
    }
    
    public static void main(String[] args) {
        Set users=new TreeSet(new Comparator(){
            public int compare(Object o1, Object o2) {
                User user1=(User)o1;
                User user2=(User)o2;
                if(user1.getName().equals(user2.getName())&&user1.getAge().equals(user2.getAge())){
                    return 0;
                }
                int flag=user1.getGrade().compareTo(user2.getGrade());
                if(flag==0){
                    flag=user1.getName().compareTo(user2.getName());
                    if(flag==0){
                        return user1.getAge().compareTo(user2.getAge());
                    }
                }
                return flag;
            }
        });
        
        users.add(new User("billx","23","90"));
        users.add(new User("bill","23","180"));
        users.add(new User("are","23","200"));
        
        System.out.println(users);
    }
}

 上面代码执行的结果是:[bill[23] :180, are[23] :200, billx[23] :90]

可是我期望的结果是:[billx[23] :90,bill[23] :180, are[23] :200 ]

题目的需求是依据用户信息排序如果用户名和年龄相同认为是同一用户,集合内用户不重复,按照成绩,姓名,年龄升序排列答应出用户信息!

请问我上面哪边错了 ,应该怎么写????

 


问题补充:
我没有注意注意类型无语了,请问如果是从一个大的文本文件中获取用户信息需要如何改动才能够提高性能!!!
问题补充:
这个问题并没有结束,因为我在测试的时候,有时用户名和年龄相等时,任然会显示出来,我想说的是User对象是不是还要overload hashcode和equals方法呢,不然光用户名和年龄相等时并不会认为是同一个用户!~!!
  • 写回答

3条回答

  • rednaxelafx 2009-06-05 08:49
    关注

    这边也发出来好了……

    TreeSet背后是TreeMap,它上面的put方法对comparator和comparable是分开处理的:
    [code] // split comparator and comparable paths
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
    do {
    parent = t;
    cmp = cpr.compare(key, t.key);
    if (cmp < 0)
    t = t.left;
    else if (cmp > 0)
    t = t.right;
    else
    return t.setValue(value);
    } while (t != null);
    }
    else {
    //...[/code]
    也就是说构造的时候给了comparator就够了。TreeMap不使用hash所以覆盖hashCode没啥可见的作用。

    问题是出在你的排除条件不适合使用TreeSet。之所以会有元素重复加到TreeSet里,是因为像这样:
    如果现在set里的顺序是:[a, b]
    接下来要加入c,它首先跟b比较,发现比b“大”,于是插入到b的后面,变成:[a, b, c]
    但如果a与c实际上属于“相等”的情况,那它们连比较的机会都没得到。

    所以说你的使用场景不适合TreeSet。你可以选择实现hashCode然后用HashSet,都加好了之后重复的元素就都没了,然后再从那个HashSet创建一个TreeSet出来,就有顺序了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog