一、集合排序
主要内容:
- 集合中的基本数据类型排序
- 集合中的字符串类型排序
- Comparator接口
- Comparable接口
1、概述
- 使用Collections类的sort()方法
- sort(List list) 根据元素的自然顺序对指定列表按升序进行排序。
2、对基本数据类型和字符串类型进行排序
对存储在list中的整型进行排序:
package com.imooc.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class IntSort {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(5);
list.add(9);
list.add(3);
list.add(1);
System.out.print("排序前:");
for(int n : list) {
System.out.print(n+" ");
}
//对整型数据进行排序
Collections.sort(list);//根据自然顺序升序排列
System.out.println();
System.out.print("排序后:");
for(int n : list) {
System.out.print(n+" ");
}
}
}
运行结果:
排序前:5 9 3 1
排序后:1 3 5 9
对存放在list中的字符串进行排序:
package com.imooc.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class StringSort {
public static void main(String[] args) {
// 对存放在List中的字符串进行排序
List<String> list=new ArrayList<String>();
list.add("orange");
list.add("blue");
list.add("yellow");
list.add("gray");
System.out.println("排序前:");
for(String s:list){
System.out.print(s+" ");
}
System.out.println();
Collections.sort(list);
System.out.println("排序后:");
for(String s:list){
System.out.print(s+" ");
}
}
}
运行结果:
排序前:
orange blue yellow gray
排序后:
blue gray orange yellow
3、Comparator接口介绍
- 强行对某个对象进行整体排序的比较函数
- 可以将Comparator传递给sort方法(如:Collections.sort或Arrays.sort)
- int compare(T o1, T o2) 比较用来排序的两个参数。
案例:
定义一个动物猫类:
package com.imooc.sort;
public class Cat {
private String name; //名字
private int month; //年龄
private String species;//品种
//构造方法
public Cat(String name, int month, String species) {
super();
this.name = name;
this.month = month;
this.species = species;
}
//getter与setter方法
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;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
@Override
public String toString() {
return "[名字:" + name + ", 年龄:" + month + ", 品种:" + species + "]";
}
}
重写根据名字排序方法:
package com.imooc.sort;
import java.util.Comparator;
public class NameComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
// 按名字升序排序
String name1=o1.getName();
String name2=o2.getName();
int n=name1.compareTo(name2);
return n;
}
}
重写根据年龄排序方法:
package com.imooc.sort;
import java.util.Comparator;
public class AgeComparator implements Comparator<Cat>{
@Override
public int compare(Cat o1, Cat o2) {
// 按年龄降序排序
int age1=o1.getMonth();
int age2=o2.getMonth();
return age2-age1;
}
}
定义主方法:
package com.imooc.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CatTest {
public static void main(String[] args) {
// 按名字升序排序
Cat huahua=new Cat("huahua",5,"英国短毛猫");
Cat fanfan=new Cat("fanfan",2,"中华田园猫");
Cat maomao=new Cat("maomao",3,"中华田园猫");
List<Cat> catList=new ArrayList<Cat>();
catList.add(huahua);
catList.add(fanfan);
catList.add(maomao);
//排序前
System.out.println("排序前:");
for(Cat cat:catList){
System.out.println(cat);
}
//按名字进行升序排序
Collections.sort(catList, new NameComparator());
System.out.println("按名字升序排序后:");
for(Cat cat:catList){
System.out.println(cat);
}
//按年龄进行降序排序
Collections.sort(catList, new AgeComparator());
System.out.println("按年龄降序排序后:");
for(Cat cat:catList){
System.out.println(cat);
}
}
}
运行结果:
排序前:
[名字:huahua, 年龄:5, 品种:英国短毛猫]
[名字:fanfan, 年龄:2, 品种:中华田园猫]
[名字:maomao, 年龄:3, 品种:中华田园猫]
按名字升序排序后:
[名字:fanfan, 年龄:2, 品种:中华田园猫]
[名字:huahua, 年龄:5, 品种:英国短毛猫]
[名字:maomao, 年龄:3, 品种:中华田园猫]
按年龄降序排序后:
[名字:huahua, 年龄:5, 品种:英国短毛猫]
[名字:maomao, 年龄:3, 品种:中华田园猫]
[名字:fanfan, 年龄:2, 品种:中华田园猫]
4、Comparable接口介绍
- 此接口强行对实现它的每个类的对象进行整体排序。
- 这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
- 对于集合,通过调用Collections.sort方法进行排序。
- 对于数组,通过调用Arrays.sort方法进行排序。
- int compareTo(T o)方法
- 该对象小于、等于、大于指定对象,则分别返回负整数、零、正整数。
案例:
对商品价格进行降序排序:
定义商品类:
package com.imooc.sort;
public class Goods implements Comparable<Goods> {
private String id;//商品编号
private String name;//商品名称
private double price;//商品价格
//构造方法
public Goods(String id,String name,double price){
this.id=id;
this.name=name;
this.price=price;
}
//getter和setter方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 String toString(){
return "商品编号:"+id+",商品名称:"+name+",商品价格:"+price;
}
@Override
public int compareTo(Goods o) {
// 取出商品价格
double price1=this.getPrice();
double price2=o.getPrice();
int n=new Double(price2-price1).intValue();
return n;
}
}
定义测试类:
package com.imooc.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class GoodsTest {
public static void main(String[] args) {
Goods g1 = new Goods("s00001", "手机", 2000);
Goods g2 = new Goods("s00002", "冰箱", 5000);
Goods g3 = new Goods("s00003", "电视机", 3000);
List<Goods> goodsList = new ArrayList<Goods>();
goodsList.add(g1);
goodsList.add(g2);
goodsList.add(g3);
// 排序前
System.out.println("排序前:");
for (Goods goods : goodsList) {
System.out.println(goods);
}
Collections.sort(goodsList);
// 排序后
System.out.println("排序后:");
for (Goods goods : goodsList) {
System.out.println(goods);
}
}
}
运行结果:
排序前:
商品编号:s00001,商品名称:手机,商品价格:2000.0
商品编号:s00002,商品名称:冰箱,商品价格:5000.0
商品编号:s00003,商品名称:电视机,商品价格:3000.0
排序后:
商品编号:s00002,商品名称:冰箱,商品价格:5000.0
商品编号:s00003,商品名称:电视机,商品价格:3000.0
商品编号:s00001,商品名称:手机,商品价格:2000.0