目录
1.1如果还不了解匿名内部类 可以暂时看看这个 理解一下匿名内部类在其中的作用(这里不对匿名内部类做过多介绍)
2.到这里大家应该都理解 决定我们排序方式的 其实就是Comparator中compare方法的返回值
1.首先理解这个sort方法我们先看一个简单的自定义排序
正常来说自定义排序sort 有两个参数,第一个就是我们要排序的数组,第二个是一个接口(匿名内部类)
Integer a[] = {1, 2, 9, 4, 6, 2, 6, 7};
Arrays.sort(a, new Comparator<Integer>() {//匿名内部类
@Override
public int compare(Integer o1, Integer o2) {
//自定义排序 o1-o2 为从小到大 返回的值是大于零还是小于零 决定排序的方式
return o1 - o2;
}
});
System.out.println(Arrays.toString(a));//展示数组信息
//[1, 2, 2, 4, 6, 6, 7, 9]输出结果
1.1如果还不了解匿名内部类 可以暂时看看这个 理解一下匿名内部类在其中的作用(这里不对匿名内部类做过多介绍)
public class A implements Comparator {
@Override
public int compare(Object o1, Object o2) {
return (int) o1-(int) o2;
}
}
Integer a[] = {1, 2, 9, 4, 6, 2, 6, 7};
Arrays.sort(a,A);//A 是实现了Compartor接口的类
System.out.println(Arrays.toString(a));//展示数组信息
//[1, 2, 2, 4, 6, 6, 7, 9]输出结果
2.到这里大家应该都理解 决定我们排序方式的 其实就是Comparator中compare方法的返回值
“返回的值是大于零还是小于零 决定排序的方式”
2.1下面是简易版本的sort底层逻辑 用冒泡排序来演示
package Com.Wrapper;
import java.util.Arrays;
import java.util.Comparator;
public class ArraysBubble {
public static void main(String[] args) {
int a[] = {1, 2, 5, 1, 632, 57, 12, 34, 2};
Bubble.SortBubble(a, new Comparator() {
@Override
public int compare(Object o1, Object o2) {//前一个值减去后一个返回差值
int i1 = (int) o1;
int i2 = (int) o2;
return i1 - i2;
}
});
System.out.println(Arrays.toString(a));
}
}
//用冒泡排序来演示 简易版 sort底层逻辑
class Bubble {
public static void SortBubble(int[] a, Comparator c) {
//第一个参数是数组 第二个是接口 接口决定了我们是交换还是不交换
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length - 1; j++) {
//向接口传值 如果前一个数减去下一个数大于零 就说明比他大我们要交换
if (c.compare(a[j], a[j + 1]) > 0) {//大于号小于号决定是从大到小还是从小到大
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
}
最后结果[1, 1, 2, 2, 5, 12, 34, 57, 632]
3.对一个对象数组进行自定义排序
package Com.Wrapper;
import java.util.Arrays;
import java.util.Comparator;
public class ArraysSort_01 {
public static void main(String[] args) {
Book book[]=new Book[5];
book[0]=new Book("红楼梦上册",45.2);
book[1]=new Book("金瓶梅中",23.23);
book[2]=new Book("三国演义下册",34.7);
book[3]=new Book("西游记",45);
book[4]=new Book("水浒传精校完整版",100.25);
//根据price排序
Arrays.sort(book, new Comparator<Book>() {//这里使用匿名内部类 实现接口方法 来自定义你想根据哪个值来排序
//底层使用的是一个二叉数排序
@Override
public int compare(Book o1, Book o2) {//o1 和 o2其实都是book o1为当前元素 o2为下一个元素
//这里需要用到if 是因为这个接口的返回类型已经固定死为int 我们必须返回int类型所做的判断
//注意这个底层是根据 返回值来判断自定义排序 o1-o2 为从小到大 返回的值是大于零还是小于零 决定顺序的方式
if (o1.getPrice()-o2.getPrice()>0) return 1;
else if (o1.getPrice()-o2.getPrice()<0) {
return -1;
}else return 0;
}
});
System.out.println(Arrays.toString(book));//展示排序后的数据
//[Book{name='金瓶梅中', price=23.23}, Book{name='三国演义下册', price=34.7}, Book{name='西游记', price=45.0}, Book{name='红楼梦上册', price=45.2}, Book{name='水浒传精校完整版', price=100.25}]
//根据name排序
Arrays.sort(book, new Comparator<Book>() {//这里使用匿名内部类 实现接口方法 来自定义你想根据哪个值来排序
//底层使用的是一个二叉数排序
@Override
public int compare(Book o1, Book o2) {//o1 和 o2其实都是book o1为当前元素 o2为下一个元素
//注意这个底层是根据 返回值来判断自定义排序 o1-o2 为从小到大 返回的值是大于零还是小于零 决定顺序的方式
return o1.getName().length()-o2.getName().length();
}
});
System.out.println(Arrays.toString(book));//展示排序后的数据
//[Book{name='西游记', price=45.0}, Book{name='金瓶梅中', price=23.23}, Book{name='红楼梦上册', price=45.2}, Book{name='三国演义下册', price=34.7}, Book{name='水浒传精校完整版', price=100.25}]
}
}
class Book{
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}