例题
编写一个Dog
类。其成员变量有:
int age;
String name;
double price;
按以下要求进行自然排序:
- 直接实现
Comparable
接口,按照年龄从小到大对Dog
数组进行自然排序
package com.cskaoyan.comparatorhomework;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
//创建数组
Dog[] dogs = new Dog[7];
//创建对象
dogs[0] = new Dog(4,"柯基",1300);
dogs[1] = new Dog(4,"花花",800);
dogs[2] = new Dog(3,"边牧",1500);
dogs[3] = new Dog(5,"哈士奇",1100);
dogs[4] = new Dog(2,"拉布拉多",1500);
dogs[5] = new Dog(2,"中华田园犬",2000);
dogs[6] = new Dog(6,"小狐狸",700);
//排序
Arrays.sort(dogs);
//输出
for (Dog d : dogs) {
System.out.println(d);
}
}
}
class Dog implements Comparable{
//成员变量
int age;
String name;
double price;
//三参构造器
public Dog(int age, String name, double price) {
this.age = age;
this.name = name;
this.price = price;
}
//重写toString方法
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
//实现Comparable接口,重写compareTo方法
public int compareTo(Object o) {
//按照年龄的大小从小到大排序
//这里出现了强转,使用泛型可以不写强转
return age - ((Dog) o).age;
}
}
- 利用
Comparator
接口,用匿名内部类和lambda
分别对Dog
数组进行自然排序。
①按照price
从大到小排序
package com.cskaoyan.comparatorhomework;
import java.util.Arrays;
import java.util.Comparator;
public class Demo {
public static void main(String[] args) {
//创建数组
Dog[] dogs = new Dog[7];
//创建对象
dogs[0] = new Dog(4,"柯基",1300);
dogs[1] = new Dog(4,"花花",800);
dogs[2] = new Dog(3,"边牧",1500);
dogs[3] = new Dog(5,"哈士奇",1100);
dogs[4] = new Dog(2,"拉布拉多",1500);
dogs[5] = new Dog(2,"中华田园犬",2000);
dogs[6] = new Dog(6,"小狐狸",700);
//排序 匿名内部类
//Comparator接口,重写compare方法
//<Dog>是泛型,可以省略强转
Arrays.sort(dogs, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
//price是double类型,需要强转为int
return (int) (o2.price - o1.price);
}
});
//输出
for (Dog d : dogs) {
System.out.println(d);
}
}
}
class Dog{
//成员变量
int age;
String name;
double price;
//三参构造器
public Dog(int age, String name, double price) {
this.age = age;
this.name = name;
this.price = price;
}
//重写toString方法
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
②按照name
的长短排序,name
越长对象越大
package com.cskaoyan.comparatorhomework;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
//创建数组
Dog[] dogs = new Dog[7];
//创建对象
dogs[0] = new Dog(4,"柯基",1300);
dogs[1] = new Dog(4,"花花",800);
dogs[2] = new Dog(3,"边牧",1500);
dogs[3] = new Dog(5,"哈士奇",1100);
dogs[4] = new Dog(2,"拉布拉多",1500);
dogs[5] = new Dog(2,"中华田园犬",2000);
dogs[6] = new Dog(6,"小狐狸",700);
//排序 lambda表达式
/*Arrays.sort(dogs,(d1,d2) -> {
return d2.name.length() - d1.name.length();
});*/
//以上代码可以压行:去掉return和大括号
Arrays.sort(dogs,(d1,d2) -> d2.name.length() - d1.name.length());
//输出
for (Dog d : dogs) {
System.out.println(d);
}
}
}
class Dog{
//成员变量
int age;
String name;
double price;
//三参构造器
public Dog(int age, String name, double price) {
this.age = age;
this.name = name;
this.price = price;
}
//重写toString方法
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
- 综合
age,name,price
进行排序,要求用lambda
表达式指向一个方法。 排序的规则是age
越小对象越小,age
相同比较name
长短,name
越短对象越小,name
长度也相等,比较price
,price
越大对象越小
package com.cskaoyan.comparatorhomework;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
//创建数组
Dog[] dogs = new Dog[7];
//创建对象
dogs[0] = new Dog(4,"柯基",1300);
dogs[1] = new Dog(4,"花花",800);
dogs[2] = new Dog(3,"边牧",1500);
dogs[3] = new Dog(5,"哈士奇",1100);
dogs[4] = new Dog(2,"拉布拉多",1500);
dogs[5] = new Dog(2,"中华田园犬",2000);
dogs[6] = new Dog(6,"小狐狸",700);
//排序
//lambda表达式 类名::方法名
Arrays.sort(dogs,Demo::myCompara);
//输出
for (Dog d : dogs) {
System.out.println(d);
}
}
//排序的规则:从小到大排序
//age越小对象越小,age相同比较name长短
//name越短对象越小,name长度也相等,比较price
//price越大对象越小
public static int myCompara(Dog d1,Dog d2){
if (d1.age != d2.age){
return d1.age - d2.age;
}
if (d1.name != d2.name){
return d1.name.length() - d2.name.length();
}
//代码执行到这里说明age相等且name的长度相等
//price是double,需要强转为int
return (int) (d2.price - d1.price);
}
}
class Dog{
//成员变量
int age;
String name;
double price;
//三参构造器
public Dog(int age, String name, double price) {
this.age = age;
this.name = name;
this.price = price;
}
//重写toString方法
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}