这个星期我一直在学习排序这方面的知识,看了许多有关的知识,也试了许多遍,但是还是不能在健鱼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;
}
这个跟上面的例子是差不多的,不过或许是我重写错误或者重写的另外的地方不对,导致运行的时候无法排序,我会努力抓紧学习相关的知识,努力作出排序。
网友评论