目录
集合排序概述
其实集合排序不难,可能是我没接触多少吧!(大佬轻喷)
个人认为学习集合排序最重要是理解排序的思想
只有理解了排序的思想,才能够更好的掌握
我说的思想不是什么高大上的东西
就是弄清楚降序和升序,这里我也词穷了,反正就是那么个意思吧
主要是开始接触排序中的降序升序的操作的时候,有点懵
第一次看,挺简单,停下来,一细看
感觉就什么都不知道了,整个脑子就混乱了
废话少说,进入正题
集合的排序主要分为两部分
第一部分:对基本数据类型的排序和字符串的排序
第二部分:对自定义数据进行排序
对自定义数据类型排序主要涉及到两个接口
Comparator接口和Comparable接口
这里要说一点
其实在数组中对自定义数据类型的排序和集合中自定义数据类型的排序是一样的,区别就是使用的方法不同,如下
在集合中排序用到的方法是Collections中的sort方法
在数组中排序用到的方法是Arrays中的sort方法
还要提一点的是,这里的sort方法
如果是对基本数据类型和字符串类型的数据进行排序的话
那么默认是进行升序排序的
API文档描述如下描述(因为在这里讲的是Collections类中的sort,所以上的这个方法的API描述文档)
对基本数据类型和字符串类型进行排序
对于基本数据类型和字符串类型进行排序其实很简单
使用Collections类中的sort方法即可,将要排序的集合放在sort方法中的参数列表就行了
首先看一下对基本数据类型是怎么排序的吧!
废话不多说,直接上代码
import java.util.ArrayList;
import java.util.Collections;
public class IntSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> l=new ArrayList<Integer>();
l.add(1);
l.add(77);
l.add(66);
l.add(58);
//排序前
System.out.println("排序前:");
for(Integer n:l) {
System.out.println(n);
}
System.out.println("**************************");
//使用sort对集合进行排序(基本数据类型)
Collections.sort(l);
System.out.println("排序后:");
for(Integer n:l) {
System.out.println(n);
}
}
}
下面对字符串类型的数据进行排列
其实字符串类型的数据和基本数据类型进行排序的方式是一样的,仅仅只是数据类型不一样而已
import java.util.ArrayList;
import java.util.Collections;
public class StringSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> str=new ArrayList<String>();
str.add("java");
str.add("kit");
str.add("amy");
//排序前
System.out.println("排序前");
for(String t:str) {
System.out.println(t);
}
//排序后
System.out.println("排序后");
Collections.sort(str);
for(String t:str) {
System.out.println(t);
}
}
}
其实通过两次的排序,无论是基本数据类型还是字符串类型的数据
排序出来的结果都是升序的,因为这是默认的排序方式
对于基本数据类型而言就是按照数字的大小进行排序
对于字符串类型的数据而言,就是通过比较ASCII码的大小进行排序
说得通俗一点,对于字母而言就是按照字母表进行排序的
虽然我觉得这样的排序没有什么意义,因为谁会无聊到对名字进行排序
除非这个排序是按照自己的规矩进行的排序,那样才有意义
因此下面会讲到对自定义的类型的数据进行排序,虽然举的例子也没有实际意义
纯粹为了学习两个对于自定义类型数据比较的接口
Comparator接口
Comparator接口和Comparable接口的诞生是为了对自定义的类型的数据进行比较
举个例子,如果对于宠物猫的年龄进行比较,那么宠物猫这是一个对象,怎么排序呢?
很多人肯定会想着,把属性取出来咯
不过这样可能会比较麻烦
所以就产生了这两个接口
首先介绍一下Comparator接口吧
对于接口中的方法,只要重写conpare方法即可,其他不用动
这里的例子是比较宠物猫的年龄
直接上代码吧!
Cat类
public class Cat {
public String name;
public int month;
public Cat(String name, int month) {
super();
this.name = name;
this.month = month;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
@Override
public String toString() {
return "Cat [name=" + name + ", month=" + month + "]";
}
}
比较器类
import java.util.Comparator;
//宠物猫的年龄比较器
public class Catbcomp implements Comparator<Cat>{
@Override
public int compare(Cat o1, Cat o2) {
// TODO Auto-generated method stub
if(o1.getMonth()>o2.getMonth()) {
return 1;
}else if(o1.getMonth()<o2.getMonth()) {
return -1;
}else {
return 0;
}
}
}
测试类
import java.util.ArrayList;
import java.util.Collections;
public class CatTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat c1=new Cat("jack", 12);
Cat c2=new Cat("mike",10);
Cat c3=new Cat("amy", 1);
ArrayList<Cat> l=new ArrayList<Cat>();
l.add(c1);
l.add(c2);
l.add(c3);
//排序前
System.out.println("排序前");
for(Cat c:l) {
System.out.println(c);
}
System.out.println("***********************");
//排序后
System.out.println("排序后");
//这里使用到的是Collections中sort的另一个重载方法,这个重载方法会加上比较器
//和之前对基本数据类型的比较的方法是不一样的
Collections.sort(l, new Catbcomp());
for(Cat c:l) {
System.out.println(c);
}
}
}
运行结果
因为这里默认是进行升序的排序
如果想要进行降序的排序,那么只要修改比较器即可
修改如下
import java.util.Comparator;
//宠物猫的年龄比较器
public class Catbcomp implements Comparator<Cat>{
@Override
public int compare(Cat o1, Cat o2) {
// TODO Auto-generated method stub
if(o1.getMonth()>o2.getMonth()) {
return -1;
}else if(o1.getMonth()<o2.getMonth()) {
return 1;
}else {
return 0;
}
}
}
运行结果
这里的降序排序其实就是稍微改了一点点
这里就是开头我要说的思想
升序的思想就是,你自己定的规矩和Comparator接口中的compare方法的逻辑一样即可
compare方法的逻辑如下,虽然前面好像提过,再讲一下吧
如果是对宠物猫中的名字进行比较,可以使用compareTo方法,进行比较
compareTo的逻辑和compare的逻辑是一样的,compareTo方法是字符串调用,是用于字符串之间的比较
compareTo不是接口中的方法,不要搞错了
上代码
Comparable接口
Comparable接口的使用方法和Comparator接口的使用方法其实差不多
对于Comparable接口的实现要放在你需要进行比较的那个类中
对于Comparator接口的实现,可以放在任意类中
还有就是使用Comparable接口实现的时候
调用的方法是Collections中sort那个只需要带集合引用的方法
不需要调用带比较器的那个方法,详细的看下面的图片
在最后我还放了张图,就是对于Comparable接口和Comparator接口的区别比较图
这里介绍一下
在Comparable接口中需要实现的方法是CompareTo
我查了一下,这个CompareTo和String类中的compareTo不是同一个方法
直接上代码吧!
这里的例子是比较商品的价格
对compareTo方法进行重写
测试类
运行结果
最后放一张图,比较一下两个接口的区别