A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;

import org.junit.Test;


public class 三道题的答案在这里 {

       
       
        /*
         * 需求:定义一个HashSet集合对象,里面存放的是Person对象,Person含有name、age属性,我们认为,当name和age
         * 都相同时,就认为是同一个元素!
         *         然后在HashSet对象中,存放2个人(“林青霞”,26),
         *         再存放 1 个人 (“林志颖”,29)
         * 最后打印这个集合,思考运行结果
         */
        @Test
        public void 第一道题答案() {
                HashSet<Person> hs = new HashSet<Person>();
                hs.add(new Person("林青霞",26));
                hs.add(new Person("林青霞",26));
                hs.add(new Person("林志颖",29));
                System.out.println(hs);
        }
       
       
       
       
       
       
       
        /*
         * TreeSet练习题
         * 利用 Comparator来完成元素的排序,具体需求如下:
         *
         * 创建一个TreeSet集合,要求把添加到这个集合中的String对象进行排序,排序规则如下:
         * 1、先按照长度排序,长度大的排在后面
         * 2、长度一样的情况,按照自然顺序排序
         */
        @Test
        public void 第二道题答案(){
                TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {
                        @Override
                        public int compare(String o1, String o2) {
                                int len = o1.length()-o2.length();
                                if (len==0) {
                                        int num = o1.compareTo(o2);
                                        return num==0?1:num;
                                }else{
                                        return len;
                                }
                        }
                });
               
                ts.add("沙鳄鱼");
                ts.add("鹰眼");
                ts.add("千八烦恼风");
                ts.add("三千世界");
                ts.add("三千世界");
               
                for (String s : ts) {
                        System.out.print(s + " ");
                }
               
        }
       
       
       
        /*
         * TreeSet练习题
         *
         * 要求使用 Comparable进行排序,
         *         先按照语文成绩排序,分数高的在前面
         *         语文成绩一样的,按照数学成绩排序,分数大的在前面
         *         数学成绩一样的,按照英语成绩排序,分数大的在前面
         *
         * 分数都相同,按照姓名的自然顺序进行排序
         *
         * 下面参数意义:姓名,语文成绩,数学成绩,英语成绩
         * new Student("lingqingxia", 89, 95, 100)
         * new Student("lingqing", 89, 96, 98)
         * new Student("lingqing", 89, 96, 100)
         * new Student("lingqing", 69, 98, 70)
         * new Student("lingqingxia", 100, 95, 100)
         * new Student("zhaosi", 100, 95, 100)
         */
        @Test
        public void 第三道题答案() {
                 Student s1 = new Student("lingqingxia", 89, 95, 100);
                 Student s2 = new Student("lingqing", 89, 96, 98);
                 Student s3 = new Student("lingqing", 89, 96, 100);
                 Student s4 = new Student("lingqing", 69, 98, 70);
                 Student s5 = new Student("lingqingxia", 100, 95, 100);
                 Student s6 = new Student("zhaosi", 100, 95, 100);
                 
                 TreeSet<Student> ts = new TreeSet<Student>();
                 ts.add(s1);
                 ts.add(s2);
                 ts.add(s3);
                 ts.add(s4);
                 ts.add(s5);
                 ts.add(s6);
                 
                 for (Student student : ts) {
                        System.out.println(student);
                }

        }
       
        /*
         * 必须重写hashCode()方法和equals()方法
         */
        class Person{
                private String name;
                private int age;
                public String getName() {
                        return name;
                }
                public void setName(String name) {
                        this.name = name;
                }
                public int getAge() {
                        return age;
                }
                public void setAge(int age) {
                        this.age = age;
                }
                public Person() {
                        super();
                }
                public Person(String name, int age) {
                        super();
                        this.name = name;
                        this.age = age;
                }
                @Override
                public String toString() {
                        return "Person [name=" + name + ", age=" + age + "]";
                }
                @Override
                public int hashCode() {
                        return name.hashCode()*31 + age*19;
                }
                @Override
                public boolean equals(Object obj) {
                        Person p = (Person) obj;
                        return this.name.equals(p.name) && this.age == p.age;
                        /*
                         * 因为我知道这个Person类是给HashSet调用的,而不是其他地方调用。所以这里的代码已经满足需求了
                         */
                }
               
               
               
        }
       
       
        class Student implements Comparable<Student>{
                private String name;
                private int chinese;
                private int math;
                private int english;
               
                public Student() {
                        super();
                       
                }
                public Student(String name, int chinese, int math, int english) {
                        super();
                        this.name = name;
                        this.chinese = chinese;
                        this.math = math;
                        this.english = english;
                }
               
                public String toString() {
                        return name + "," + chinese + "," + math + "," + english ;
                }
                @Override
                public int compareTo(Student o) {
                        /*
                         * 先按照语文成绩排序,分数高的在前面
                         *         语文成绩一样的,按照数学成绩排序,分数大的在前面
                         *         数学成绩一样的,按照英语成绩排序,分数大的在前面
                         *
                         * 分数都相同,按照姓名的自然顺序进行排序
                         */
                        int yuwen = this.chinese-o.chinese;
                        if (yuwen==0) {
                                int shuxue = this.math-o.math;
                                if (shuxue==0) {
                                        int yingyu = this.english-o.english;
                                        if (yingyu==0) {
                                                return this.name.compareTo(o.name);
                                        }else{
                                                return -yingyu;
                                        }
                                }else{
                                        return -shuxue;
                                }
                        }else{
                                return -yuwen;
                        }
                }
               
        }

       
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马