您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第三季学习笔记-对象比较器
发布时间:2017-08-10 15:15:50编辑:雪饮阅读()
比较器的作用
对两个或多个数据项进行比较,以确定它们是否相等,或确定它们之间的大小关系及排列顺序称为比较。
前面我们学习过Arrays.sort方法可实现对象的排序操作
public static void sort(Object[] a)
小技巧:
当在类中要将该类的属性全部显示出来,就需要提供一个函数,我们可以自己写,也可以生成。
如果是eclipse就用alt+shift+s出现如下图:
选择Generate toString()…
这里都保持默认即可。
然后就会在你的类中生成一个toString的函数。例如我这里生成的如下:
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
如果把多个对象放在数组中,然后对数组进行排序则会报类型转换的错误。
这是因为对象本身有多个属性,排序时谁知道你要根据那个属性排序。
另外在排序时使用了类型转换,自定义类转换为Comparable,而自定义类与Comparable没有任何关系。
问题解决:实现Comparable接口
Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
public interface Comparable<T>{
int compareTo(T o);//o是要比较的对象
//比较此对象与指定对象的顺序
}
返回-1,0或1中的一个值
根据此对象是小于、等于还是大于指定对象。
代码示例:
主程序:PersonSortDemo.java
package com.vince.sort;
import java.util.Arrays;
public class PersonSortDemo {
public static void main(String[] args) {
String[] names={"雪饮","柠檬不萌","聂风","第二梦","雪饮","薄雪草"};
Person[] persons={
new Person("雪饮",25),new Person("柠檬不萌",25),
new Person("聂风",30),new Person("第二梦",30),
new Person("雪饮",25),new Person("薄雪草",25)
};
//自定义对象数组排序
Arrays.sort(persons);
System.out.println(Arrays.toString(persons));
}
}
Person类程序:
package com.vince.sort;
import java.util.Arrays;
//人类
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(){}
public Person(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;}
//该函数为Arrays.toString函数提供
//Arrays.toString函数将数组转换为字符串,但因为数组是对象数组,则会生成多个对象的引用地址组成的字符串,但若对象中提供有
//toString函数则会将该函数的返回值替换原来每个对象的引用地址,那么生成的就是多个对象的toString函数的返回值组成的字符串
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//比较器的比较方法
@Override
public int compareTo(Person o) {
//实现:定义对象之间的比较规则
//这里比对的是年龄
if(o==null){throw new NullPointerException();}
if(this.age<o.age){return -1;}
else if(this.age>o.age){return 1;}
return 0;
}
}
Comparator接口
Comparator接口时要求自定义类去实现,按照OO原则:对修改关闭,对扩展开放。
那么如果这个类已经定义好了,不想去修改它,那么如何实现比较呢?
Arrays.sort有一个这样的重载方法:
public static <T> void sort(T[] a,Comparator<? super T>c)
Comparator接口:强行对某个对象collection(表示一组对象)进行整体排序的比较。
int compare(T o1,T o2)//比较用来排序的两个参数。
根据第一个参数小于、等于或大于第二个参数分别返回负整数、0或正整数。
代码示例:
主程序:Person2SortDemo
package com.vince.sort;
import java.util.Arrays;
public class Person2SortDemo {
public static void main(String[] args) {
Person2[] persons2={
new Person2("雪饮",25),new Person2("柠檬不萌",25),
new Person2("聂风",30),new Person2("第二梦",30),
new Person2("雪饮",25),new Person2("薄雪草",25)
};
//自定义对象数组排序
Arrays.sort(persons2,new Person2Comparator());
System.out.println(Arrays.toString(persons2));
}
}
待排序对象类:Person2
package com.vince.sort;
//人类
public class Person2{
private String name;
private int age;
public Person2(){}
public Person2(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;}
//该函数为Arrays.toString函数提供
//Arrays.toString函数将数组转换为字符串,但因为数组是对象数组,则会生成多个对象的引用地址组成的字符串,但若对象中提供有
//toString函数则会将该函数的返回值替换原来每个对象的引用地址,那么生成的就是多个对象的toString函数的返回值组成的字符串
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
结合Arrays.sort函数进行对象排序的扩展类:Person2Comparator
package com.vince.sort;
import java.util.Comparator;
public class Person2Comparator implements Comparator<Person2> {
@Override
public int compare(Person2 o1, Person2 o2) {
if(o1==null || o2==null){
throw new NullPointerException();
}
if(o1.getAge()<o2.getAge()){
return -1;
}
else if(o1.getAge()>o2.getAge()){
return 1;
}
return 0;
}
}
关键字词:javase,对象比较器