Java集合排序一:基本数据类型和字符串数据类型的排序;自定义数据类型的集合排序:Comparator接口;

本文详细介绍了如何使用Java中的Collections.sort()方法对存储在集合中的不同数据类型进行排序,包括基本数据类型、字符串类型以及自定义类型。并通过具体示例展示了如何利用Comparator接口实现自定义排序逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

疑问:存储在集合中的数据如何排序?

1)存储在集合中的基本数据类型和字符串类型如何排序?

2)存储在集合中的字符串类型如何排序?

3)自定义的类型,在集合中如何排序?(Comparator接口和Comparable接口,这两个接口中定义了比较器,自定义的类可以依照这个比较器进行排序)


回顾:以前数组排序的排序是:Arrays类的sort()方法

那么集合如何排序?

集合排序是使用Collections类中定义的sort()方法对List集合中的数据进行排序:


1.基本数据类型和字符串数据类型的排序

List中整型数据的排序:Collections类的Sort()方法:

List中String类型数据的排序:Collections类的Sort()方法:


2.自定义数据类型的集合排序:Comparator接口

使用Comparator接口或Comparable接口去定义排序的依据.

Comparator接口:

(1)Comparator接口相当于是一个比较器,其可以强行对集合中自定义数据进行排序;即一个实现了这个接口,并按照自己的逻辑重写了compare()方法的类就是一个可以使用的比较器;

(2)可以将Comparator接口(实际是是实现类这个接口的类的示例对象)作为一个参数传递给sort()方法;

                 即如果是对集合中的自定义数据排序的话,Comparator接口传递给collections.sort()方法;

                 如果是对数组中的自定义数据进行排序的话,Comparator接口传递给Arrays.sort()方法;

(3)Comparator接口中有一个 int compare(T o1,T o2)方法:(o1和o2是需要比较的两个对象):

                 如果o1<o2,返回负整数;

                 如果o1==o2,返回0;

                 如果o1>o2,返回正整数;返回值是排序的依据。

(4)Comparator接口中有一个 boolean equals(Object obj) 方法:

                  这个是继承自Object的equals(),即被Object类中的equals()方法覆盖了,不必要重写,即不用管它。

(5)java.util包下的接口。

……………………………………………………

如下示例:集合中存储Cat类对象,按名字升序,或者,按年龄降序

Cat类:集合中存储对象的类型;

NameComparator类:实现Comparator接口并实现其int compare(T o1,T o2)方法,从而作为一个比较器;

CatTest类:测试类;

/*******************

注:

其排序最终还是调用Collections.sort()方法,只不过调用的是,sort()方法的另一个有两个参数的重载形式而已。

***********************************/

/**
 * Cat类,集合中存储对象的类型
 * @author Administrator
 *
 */
public class Cat {
	private String name;
	private int month;
	private String species;
	
	public Cat(){}
	
	public Cat(String name,int month,String species){
		this.name= name;
		this.month = month;
		this.species = species;
	}

	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;
	}
	

}

这儿因为业务需求,需要比较字符串,所有用到了String类中的compareTo()方法 

/**
 * NameComparator类实现了Comparator接口,并根据业务逻辑要求,实现了接口中的compare方法。
 * 该类可以作为一个比较器,后面其作为Collection.sort()方法的一个参数,影响排序策略和结果
 * @author Administrator
 *
 */
public class NameComparator implements Comparator<Cat> {

	@Override
	public int compare(Cat arg0, Cat arg1) {
		
		String name1 = arg0.getName();
		String name2 = arg1.getName();
		// int compareTo(String str)方法:如果name1<name2,返回负整数;如果相等返回0;否则返回正整数。
		// 正好compareTo()方法的返回值逻辑和Comparator接口的compare()方法(即本方法)的逻辑是一样的;
		// 所以本compare()方法直接返回n即可了
		int n = name1.compareTo(name2);
		// 很显然,如果向按名字倒叙排列的话,只需要将上改成:int n = name2.compareTo(name1);即可
		
		return n;
	}

}
public class CatTest {

	public static void main(String[] args) {
		
		Cat cat1 = new Cat("huahua",5,"短毛猫");
		Cat cat2 = new Cat("fanfan",2,"田园猫");
		Cat cat3 = new Cat("maomao",3,"小黑猫");
		
		ArrayList<Cat> list = new ArrayList<Cat>();
		list.add(cat1);
		list.add(cat2);
		list.add(cat3);	
		System.out.print("排序前: ");
		for(Cat cat:list){
			System.out.print(cat+"******");
		}
		System.out.println();
		// 把实现了Comparator接口的类的对象作为参数传入,作为集合的比较器
		Collections.sort(list, new NameComparator());  // Collections方法中sort()方法的重载
		System.out.print("排序后来: ");
		for(Cat cat:list){
			System.out.print(cat+"******");
		}
		
	}

}

……………………………………………………

按年龄降序排列:比较器AgeComperator类

/**
 * NameComparator类实现了Comparator接口,并根据业务逻辑要求,实现了接口中的compare方法。
 * 该类可以作为一个比较器,后面其作为Collection.sort()方法的一个参数,影响排序策略和结果.
 * 按年龄降序排序
 * @author Administrator
 *
 */
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;
		//  return age1-age2;这是升序。这而的返回值,只要符合逻辑即可。
	}


}

然后将CatTest类中的Collections.sort(list, new NameComparator());改为Collections.sort(list, new AgeComparator());即可,即修改下比较器即可。

public class CatTest {

	public static void main(String[] args) {
		
		Cat cat1 = new Cat("huahua",5,"短毛猫");
		Cat cat2 = new Cat("fanfan",2,"田园猫");
		Cat cat3 = new Cat("maomao",3,"小黑猫");
		
		ArrayList<Cat> list = new ArrayList<Cat>();
		list.add(cat1);
		list.add(cat2);
		list.add(cat3);	
		System.out.print("排序前: ");
		for(Cat cat:list){
			System.out.print(cat+"******");
		}
		System.out.println();
		// 把实现了Comparator接口的类的对象作为参数传入,作为集合的比较器
		Collections.sort(list, new AgeComparator());  // Collections方法中sort()方法的重载
		System.out.print("排序后来: ");
		for(Cat cat:list){
			System.out.print(cat+"******");
		}
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值