美文网首页
使用Comparable进行比较与在健鱼APP进行实验的问题

使用Comparable进行比较与在健鱼APP进行实验的问题

作者: W_Nicotine | 来源:发表于2017-10-14 21:11 被阅读0次

    这个星期我一直在学习排序这方面的知识,看了许多有关的知识,也试了许多遍,但是还是不能在健鱼APP上面对医生的职称进行排序,不过我也大致学到了一种排序方法,那就是Comparable接口比较。

    • 首先我先讲讲Comparable的使用。

    Comparable是在集合内部定义的方法实现的排序,如果需要排序,就要在集合内实现Comparable接口的方法,也就是重写其中的compareTo(T o)方法。在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()(1.6jdk下的一个方法)来排序对象数组。对于不同的的排序要求,也有不同的排序规则。

    例如:

       @Override
       public int compareTo(Student another) {
           int num = Integer.valueOf(this.age).compareTo(another.age);//先比较年龄
           if (num == 0) {
               return this.name.compareTo(another.name);//如果年龄相同,再比较姓名(姓名按Unicode编码升序排序)
           }
           return num;
       }
    
    像上面的代码中:

    compareTo():大于0表示前一个数据比后一个数据大, 0表示相等,小于0表示前一个数据小于后一个数据相等时会走到equals(),这里讲姓名年龄都一样的对象当作一个对象。先定义一个num等于年龄的比较,如果num等于0,表示比较的年龄是相等的,这样我们就执行下一步,当年龄一样时的名字比较(按Unicode编码的升序排序)。

    还有一种是:

        public int compareTo(Student o) {
            // TODO Auto-generated method stub
            if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
                return -1;//由高到底排序
            else if(this.score<o.score)
                return 1;
            else{
                if(this.age>o.age)
                    return 1;//由底到高排序
                else if(this.age<o.age)
                    return -1;
                else
                    return 0;
            }
       }
    }
    

    这里我们定义了 score ,age。我们可以从这段代码读到,首先比较score,如果在比较的这条score大于这组数据里面的其他score,那么就返回-1,也就是由高到低排序,反之,如果在比较的这条score小于这组数据里面的其他score,那就返回1,也就是由低到高排序,对于age的比较排序也是一样的。
    下面我们来举一个简单的例子 :

    这个简单例子是在上述第一个compareTo中完善而来的。

    class Student implements Comparable<Student> {
    
        private String name;
        private int age;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = 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;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        @Override
        public int hashCode() {
            return name.hashCode();
        }
    
        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Student)) {
                throw new ClassCastException("不是学生对象");
            }
            Student s = (Student) o;
            return this.name.equals(s.name) && this.age == s.age;
        }
    
        @Override
        public int compareTo(Student another) {
            int num = Integer.valueOf(this.age).compareTo(another.age);
            if (num == 0) {
                return this.name.compareTo(another.name);)
            }
            return num;
        }
    }
    

    可以看到,这里我们创建一个叫Student的类,而且定义了一个name和age.这两个变量是接下来我们要比较的。
    我们还要在MainActivity中把要处理的数据写进来:

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
        }
    
        private void initData() {
            TreeMap<Student, String> map = new TreeMap<>();
            map.put(new Student("a", 28), "小红");
            map.put(new Student("b", 23), "小明");
            map.put(new Student("c", 22), "小华");
            map.put(new Student("c", 22), "小强");//此Key与上面的相同,会将上面的Value覆盖
            map.put(new Student("d", 25), "小志");
            map.put(new Student("d", 25), "小羊");//此Key与上面的相同,会将上面的Value覆盖
            Set<Map.Entry<Student, String>> set = map.entrySet();
            Iterator<Map.Entry<Student, String>> iterator = set.iterator();
            while (iterator.hasNext()) {
                Map.Entry<Student, String> entry = iterator.next();
                Student student = entry.getKey();
                String address = entry.getValue();
                Log.e("yuzhentao", "Student=" + student + " Address=" + address);
            }
        }
    }
    

    最后的结果是这样的:

    图一

    这样我们就可以得出了排序的结果,因为有两个人的年龄一样,所以后面的就把前面那个人给覆盖了,这就是一个简单的排序的例子。

    • 在健鱼APP中遇到的困难

    在健鱼APP中,我是在BeanDoctorInfo中写入的Comparable接口的,我在BeanDoctorInfo中重写了排序需要的compareTo。

        public int compareTo(@NonNull BeanDoctorInfo o) {
            int num = Integer.valueOf(this.price).compareTo(Integer.valueOf(o.price));
            if (num == 0) {
                return this.duties.compareTo(o.duties);
            }
            return num;
        }
    
    

    这个跟上面的例子是差不多的,不过或许是我重写错误或者重写的另外的地方不对,导致运行的时候无法排序,我会努力抓紧学习相关的知识,努力作出排序。

    相关文章

      网友评论

          本文标题:使用Comparable进行比较与在健鱼APP进行实验的问题

          本文链接:https://www.haomeiwen.com/subject/sdioyxtx.html