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

2017-10-14  本文已影响0人  W_Nicotine

这个星期我一直在学习排序这方面的知识,看了许多有关的知识,也试了许多遍,但是还是不能在健鱼APP上面对医生的职称进行排序,不过我也大致学到了一种排序方法,那就是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中,我是在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;
    }

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

上一篇下一篇

猜你喜欢

热点阅读