Java 集合排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对字符串排序代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class StringList {

	public static void main(String[] args) {
	List<String>list=new ArrayList();
	list.add("orange");
	list.add("tomato");
	list.add("apple");
	list.add("litchi");
	list.add("banana");
	System.out.println("排序前");
	for(String n:list) {
		System.out.print(n+"  ");
	}
	System.out.println();
	System.out.println("排序后");
	Collections.sort(list);
	for(String n:list) {
		System.out.print(n+"  ");
	}
	}

}

Comparator接口

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
ArrayList输出:
在这里插入图片描述

Comparable接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按字符串排序:在这里插入图片描述
浮点型排序:在这里插入图片描述

关于compareTo()方法

在学习Comparable接口时,我们用到了compareTo()方法,用于对对象属性进行比较,根据返回结果进行排序。那么基本数据类型的包装类和字符串也都有compareTo()方法,下面分别来看一下:
在这里插入图片描述

1、 基本数据类型以Integer为例,来看一下Integer类的compareTo()方法

public int compareTo(Integer anotherInteger)

这里的compareTo()方法的参数是要比较的Integer对象

对于返回值,如果调用compareTo()方法的对象等于参数,则返回0,如果大于参数,则返回一个大于0的值;如果小于参数,则返回一个小于0 的值

案例代码和运行效果如下,可以看到相等时返回0,大于参数时返回值1,小于参数时返回-1
在这里插入图片描述

运行效果:
在这里插入图片描述

2、String的compareTo()方法

public int compareTo(String anotherString)

这个方法是按字典顺序比较两个字符串,比较的是字符串中每个字符的unicode值。

对于返回值,如果两个字符串相等,则返回值为0;如果字符串对象比参数小,则返回一个小于0的数;如果字符串对象比参数大,则返回一个大于0的数

案例代码和运行效果如下:
在这里插入图片描述

运行效果如下:
在这里插入图片描述

相等的情况比较简单,返回的结果是0。对于小于和大于的情况,可以看到返回结果不都是-1和1,而是不同的值。这是它们之间的比较时,unicode值进行减法运算的结果。比如abc和bcd进行比较,a比b的unicode值小1,所以结果为-1。而abc与cde比较,a比c的值小2,所以返回值为-2。大于的情况也是如此进行比较的。

Comparator和Compatable的区别(课堂)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Comparable和Comparator的区别

前面我们已经学习过Comparator和Comparable接口的使用,下面来总结一下二者的区别。

1、Comparator接口位于java.util包下,而Comparable接口位于java.lang包下

2、对于Comparator接口,可以看到它的compare()方法的参数是两个对象,比如我们队Cat类进行比较,那么这里就是两个要比较的Cat类的对象,所以可以有一个单独的类实现Comparator
在这里插入图片描述

对于Comparable接口,它的方法只有一个对象作为参数,所以要比较的类需要实现Comparable接口,将当前对象与方法参数中的对象进行比较。
在这里插入图片描述

因此,如果使用Comparator接口,那么要比较的类和实现Comparator接口的类可以分开,如果使用Comparable接口,那么要比较的类就要实现Comparable接口才可以。

3、关于应用场景

一般情况下如果对某个类进行排序,比如Cat类,如果使用Comparable接口的方式,那么Cat类需要实现Comparable接口。如果Cat类通过Comparable接口的方式实现排序,比如通过name排序了。那么我们还希望通过age进行排序,这时不希望修改Cat类,那此时就需要使用Comparator接口了

因此,Comparable接口可以作为实现类的默认排序算法,Comparator接口则用于一个类的扩展排序

关于TreeSet的使用

TreeSet是一个有序的集合,它支持自然排序和根据实现Comparator或Comparable接口进行排序。下面我们通过案例来看一下TreeSet的使用。

1、 使用TreeSet对String类型的数据进行存储,存储顺序默认按字母升序排序。

在本例题中,定义TreeSet集合,并添加多个字符串到集合中,然后对集合进行遍历输出,并通过first()和last()方法来获取集合的第一个和最后一个元素。
在这里插入图片描述

运行效果:

在这里插入图片描述
2、 使用TreeSet对Integer类型数据进行存储,存储顺序默认按数字从小到大排序。

在本例题中,定义TreeSet对象,并向集合中添加整型数据,然后输出集合对象,也就是将数据放到[]中输出,这是集合的默认输出格式。最后使用floor()方法获得集合中最大的元素小于或等于给定元素的值,并输出。

代码如下:
在这里插入图片描述

运行效果如下:
在这里插入图片描述

说明:

1) 关于floor()方法,对于intSet.floor(10),集合中有等于10的元素,所以输出结果为10;对于intSet.floor(2),集合中没有2,那么小于2的最大元素就是-1,所以输出结果为-1;对于intSet.floor(-2),由于集合中没有小于等于-2的元素,所以输出结果为null

2) 与floor()方法类似,TreeSet中还有一个higher()方法,用于返回严格大于给定元素的该集合中的最小元素,如果没有此元素则返回 null。小伙伴可以参考floor()方法进行练习呦~

3、 当TreeSet中添加自定义类的对象时,是如何进行排序的呢?

这里需要实现Comparator和Comparable接口指定以什么属性进行排序,以及是升序还是降序排序。

下面以Comparator接口为例,实现Person对象按年龄升序排序。

1) 定义Person类,包括编号、姓名和年龄三个属性,以及构造方法,get和set方法,toString()方法等内容。下面代码省略了get和set方法,运行时可以补上。
在这里插入图片描述

2)定义PersonComparator类,实现年龄的升序排序
在这里插入图片描述

3、在测试类的主方法中,定义五个Person类的对象,并添加到TreeSet中,然后显示集合所有元素。并使用pollFirst()方法返回并删除集合第一个元素。

在这里插入图片描述
运行效果:
在这里插入图片描述

说明:

1)注意创建TreeSet对象时,要指定Comparator接口的实现类作为参数

在这里插入图片描述

2) 这里使用了pollFirst()方法,该方法比较特殊,可以返回元素,但是又把这个元素删除了,所以再次循环输出就没有age为17的元素了。

3) 还有一个方法pollLast(),功能是检索并删除最后一个元素,如果集合为空,则返回null。该方法的使用方式与pollFirst()类似,小伙伴可以尝试使用

4) 如果对age进行降序排序,可以将PersonComparator类的如下选中代码改为:o2.getAge()-o1.getAge()
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值