Java自定义类型的比较(Comparable和Comparator)
程序员文章站
2022-05-24 18:13:51
...
在实际开发过程中,我们不仅需要对基本数据类型之间进行比较,有时还需要比较自定义类型,那么我们怎样实现自定义类型之间的比较呢?
在java中,自定义类型之间不可以通过大于,小于,等于进行比较。一般情况下,我们会通过下面两种方式实现自定义类型的比较,①实现Comparable接口 ②实现Comparator接口
1.Comparable接口:下面我写一个自定义类并实现Comparable接口来演示自定义类的比较
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
if(this.age > o.age) {
return 1;
}
if(this.age == o.age) {
return 0;
}
return -1;
}
}
public class TestDemo {
public static void main(String[] args) {
Student student1 = new Student("bit",12);
Student student2 = new Student("gaobo",13);
if(student1.compareTo(student2) > 0 ) {
System.out.println("student1的年龄 > student2的年龄");
}else if(student1.compareTo(student2) == 0){
System.out.println("student1的年龄 == student2的年龄");
}else {
System.out.println("student1的年龄 < student2的年龄");
}
}
}
此段代码的运行结果为:student1的年龄 < student2的年龄
我们可以看到,上面的代码是实现了对年龄的比较,但是如果我们想对姓名进行比较呢?这也就显示了这个接口的弊端了,如果按照姓名比较,我们需要重新实现compareTo方法。
具体如下:
@Override
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
它的弊端就是,一旦在类中写死,就只能修改类内部,太不适用了!
2.Comparator:此接口也叫比较器,下面我们再次写一个自定义类,看看它是怎么实现自定义类型之间的比较的
class Person {
public String name;
public int age;
public int score;
public Person(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
//如果从小到大排序 o1.age < o2.age; 交换
return o1.age-o2.age;
}
}
class ScoreComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.score-o2.score;
}
}
public class TestComparator {
public static void main2(String[] args) {
Person person1 = new Person("gao",14,89);
Person person2 = new Person("bit",54,19);
Person person3 = new Person("hello",24,79);
//根据分数进行比较
ScoreComparator scoreComparator = new ScoreComparator();
System.out.println(scoreComparator.compare(person1,person2));
System.out.println(scoreComparator.compare(person2,person3));
System.out.println(scoreComparator.compare(person1,person3));
}
public static void main1(String[] args) {
Person person1 = new Person("gao",14,89);
Person person2 = new Person("bit",54,19);
Person person3 = new Person("hello",24,79);
//根据年龄进行比较
AgeComparator ageComparator = new AgeComparator();
System.out.println(ageComparator.compare(person1,person2));
System.out.println(ageComparator.compare(person2,person3));
System.out.println(ageComparator.compare(person1,person3));
}
}
上面的方法就比较方便了,想拿什么比较,自己写个比较器就好,非常便捷。
此外此接口还有一个高级用法,我们看下面这个图可以知道,Arrays类的sort()方法有一个可以根据指定的比较器对指定的对象数组进行比较的重载方法,因此我们可以给Arrays.sort()的第二个参数,传入排序的比较器,来规定它的比较方式
演示如下:
public static void main(String[] args) {
Person[] people = new Person[3];
people[0] = new Person("gao",14,89);
people[1] = new Person("bit",54,19);
people[2] = new Person("hello",24,79);
ScoreComparator scoreComparator = new ScoreComparator();
Arrays.sort(people,scoreComparator);
System.out.println(Arrays.toString(people));
}
3.总结
综上所述:Java自定义类型的比较,一定要实现这两个接口,具体的要看业务需求。
上一篇: J2EE常用工具类——文件操作类
推荐阅读
-
【Java】自定义能储存和装载不同(class)数据类型的ArrayList
-
Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
-
Java中Integer和int数据类型的比较
-
java中元素排序Comparable和Comparator的区别
-
Java 两种比较器的区别:Comparable 与 Comparator
-
来吧,一文彻底搞懂Java中的Comparable和Comparator
-
Java比较器——Comparable接口和Comparator接口
-
【小家Java】聊聊Java中的比较器(排序):Comparable和Comparator;Spring中的Comparators和AnnotationAwareOrderComparator
-
java-如何在不使用比较器和比较器接口的情况下对地图进行排序?如何编写自定义排序?
-
深入浅出了解java比较器 区分Comparable与Comparator的差异以及对象数组的排序