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

关于集合类运用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条)

报告相同问题?

悬赏问题

  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示