r-ll-r 2023-11-25 11:13 采纳率: 75%
浏览 3

Java中Treeset自定义排序的错误

在书上找的一串Treeset自定义排序代码,为什么最后没能正确输出?

import java.util.Comparator;

import java.util.TreeSet;

class Student{
    private String name;
    private String id;/*age数据类型不能换为intCompareTo是String类的一个方法*/
    public Student(String id,String name){
        this.name=name;
        this.id=id;
    }
    public String getId(){
        return id;
    }
    public String getName(){
        return name;
    }

    public String toString() {
        return id+":"+name;
    }
}
public class Desdend {
    public static void main(String[] args){
        TreeSet ts = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Student stu1 = (Student) o1;
                Student stu2 = (Student) o2;
                if (!stu1.getId().equals(stu2.getId())) {
                    return stu1.getId().compareTo(stu2.getId());
                } else {
                    return stu1.getName().compareTo(stu2.getName());
                }
            }
        });
        ts.add(new Student("38","张三"));
        ts.add(new Student("28","李四"));
        ts.add(new Student("78","王五"));
        ts.add(new Student("8","赵六"));
        System.out.println(ts);
    }
}

以上代码为什么没能对数据进行正确排序,与第27行有什么关系,为什么会是灰色

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-25 15:32
    关注

    【以下回答由 GPT 生成】

    问题描述:

    我在书上找到了以下一串TreeSet自定义排序的Java代码,但是无法正确输出结果。我想要对学生名称和ID进行排序。这个代码有什么错误吗?能帮我进行优化吗?

    import java.util.TreeSet;
    
    class Student implements Comparable<Student> {
        private String name;
        private int id;
    
        public Student(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public int getId() {
            return id;
        }
    
        @Override
        public int compareTo(Student student) {
            return this.name.compareTo(student.name);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Student> students = new TreeSet<>();
            students.add(new Student("Alice", 2));
            students.add(new Student("Bob", 1));
            students.add(new Student("Charlie", 3));
    
            for (Student student : students) {
                System.out.println(student.getName() + " - " + student.getId());
            }
        }
    }
    

    请检查代码中的compareTo方法是否可以正确比较学生的ID。另外,对名称和ID都进行排序,您可以使用Comparator来自定义排序逻辑。

    以下是修复后的代码:

    import java.util.Comparator;
    import java.util.TreeSet;
    
    class Student implements Comparable<Student> {
        private String name;
        private int id;
    
        public Student(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public int getId() {
            return id;
        }
    
        @Override
        public int compareTo(Student student) {
            // 先按照姓名排序
            int nameComparison = this.name.compareTo(student.name);
            // 如果姓名相同,则按照ID排序
            if (nameComparison == 0) {
                return Integer.compare(this.id, student.id);
            }
            return nameComparison;
        }
    
        public static class StudentComparator implements Comparator<Student> {
            @Override
            public int compare(Student student1, Student student2) {
                // 先按照姓名排序
                int nameComparison = student1.name.compareTo(student2.name);
                // 如果姓名相同,则按照ID排序
                if (nameComparison == 0) {
                    return Integer.compare(student1.id, student2.id);
                }
                return nameComparison;
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            TreeSet<Student> students = new TreeSet<>(new Student.StudentComparator());
            students.add(new Student("Alice", 2));
            students.add(new Student("Bob", 1));
            students.add(new Student("Charlie", 3));
    
            for (Student student : students) {
                System.out.println(student.getName() + " - " + student.getId());
            }
        }
    }
    

    这样修改后的代码会先按照姓名进行排序,如果姓名相同,则按照ID排序。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月25日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址