从零开始的Java开发1-6-1 集合排序:对整型和字符串Comparator接口Comparable接口

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发1-6-1 集合排序:对整型和字符串Comparator接口Comparable接口相关的知识,希望对你有一定的参考价值。

文章目录

数组的排序

int[] arr= 1,2,3,4,5,1;
Arrays.sort(arr);

集合排序

使用Collections类的sort()方法;
sort(List<T> list):根据元素的自然顺序指定列表按升序进行排序。

案例:对整型排序

public class IntSort 

	public static void main(String[] args) 
		// 对存储在List中的整型数据进行排序
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(9);
		list.add(0);
		list.add(2);

		System.out.println("排序前:");
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + "  ");
		

		System.out.println();
		Collections.sort(list);
		System.out.println("排序后:");
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + "  ");
		
	



输出:

排序前:
1  9  0  2  
排序后:
0  1  2  9  

案例:对字符串进行排序

根据ASCII码进行排序。

public static void main(String[] args) 
		// 对存储在List中的整型数据进行排序
		List<String> list = new ArrayList<String>();
		list.add("2");
		list.add("1");
		list.add("a");
		list.add("JAVA");
		

		System.out.println("排序前:");
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + "  ");
		

		System.out.println();
		Collections.sort(list);
		System.out.println("排序后:");
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + "  ");
		
	

输出:

排序前:
2  1  a  JAVA  
排序后:
1  2  JAVA  a  

Comparator接口

Java.util包下。

  • 强行对某个对象进行整体排序的比较函数
  • 可以将Comparator传递给sort方法(如Collections.sortArrays.sort
  • int compare(T o1,T o2 ),比较用来排序的两个参数:o1<o2返回负整数;=返回0;o1>o2返回正整数
  • boolean equals(Object obj)指示某个其他对象是否“等于”此Comparator:此方法可以被Object类中的equals方法覆盖,不必重写

案例:对宠物猫分别按名字升序、年龄降序进行排列

核心代码:Collections.sort(list,new NameComparator());

按名字升序

代码:“名字比较器”的类,实现Comparator这个接口

//定义一个“名字比较器”的类,它实现了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;
	


代码:测试类

public static void main(String[] args) 
		// 按名字升序排序
		Cat hua = new Cat("huahua", 5, "英短");
		Cat fan = new Cat("fanfan", 2, "狸花");
		Cat mao = new Cat("maomao", 3, "中华田园猫");

		List<Cat> list = new ArrayList<Cat>();
		list.add(hua);
		list.add(fan);
		list.add(mao);

		// 排序前
		System.out.println("排序前:");
		for (int i = 0; i < list.size(); i++) 
			System.out.println(list.get(i).toString());
		
		System.out.println();

		// 按名字升序排序——排序后
		Collections.sort(list, new NameComparator());
		System.out.println("排序后:");
		for (int i = 0; i < list.size(); i++) 
			System.out.println(list.get(i).toString());
		
		System.out.println();
	

输出:

排序前:
[姓名=huahua, 年龄=5, 品种=英短]
[姓名=fanfan, 年龄=2, 品种=狸花]
[姓名=maomao, 年龄=3, 品种=中华田园猫]

排序后:
[姓名=fanfan, 年龄=2, 品种=狸花]
[姓名=huahua, 年龄=5, 品种=英短]
[姓名=maomao, 年龄=3, 品种=中华田园猫]

按年龄降序
比较类:

//年龄降序比较器
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;
	

测试输出:

按年龄降序排序后:
[姓名=huahua, 年龄=5, 品种=英短]
[姓名=maomao, 年龄=3, 品种=中华田园猫]
[姓名=fanfan, 年龄=2, 品种=狸花]

Comparable接口

Java.lang包下。

  • 此接口强行对实现它的每个类的对象进行整体排序
  • 这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法
  • 对于集合,通过调用Collections.sort方法进行排序
  • 对于数组,通过调用Arrays.sort方法进行排序
  • int compareTo(T o)方法:对象小于、等于、大于指定对象,则分别返回负整数、0、或正整数

案例:对商品价格进行降序排列

核心代码:Collections.sort(list);

商品类:

public class Goods implements Comparable<Goods> 
	//属性和方法
	....
	//比较类
	@Override
	public int compareTo(Goods o) 
		double price1 = this.getPrice();
		double price2 = o.getPrice();
		int n = new Double(price2 - price1).intValue();
		return n;
	

测试类:

public class GoodsTest 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		Goods g1 = new Goods("S01", "电视", 2000);
		Goods g2 = new Goods("S02", "电脑", 6000);
		Goods g3 = new Goods("S03", "手机", 4000);

		List<Goods> list = new ArrayList<Goods>();
		list.add(g1);
		list.add(g2);
		list.add(g3);

		// 排序前
		System.out.println("排序前:");
		for (Goods l : list) 
			System.out.println(l.toString());
		

		// 排序后
		Collections.sort(list);
		// 排序前
		System.out.println("排序前:");
		for (Goods l : list) 
			System.out.println(l.toString());
		
	



输出:

排序前:
[商品编号=S01, 商品名字=电视, 商品价格=2000.0]
[商品编号=S02, 商品名字=电脑, 商品价格=6000.0]
[商品编号=S03, 商品名字=手机, 商品价格=4000.0]
排序前:
[商品编号=S02, 商品名字=电脑, 商品价格=6000.0]
[商品编号=S03, 商品名字=手机, 商品价格=4000.0]
[商品编号=S01, 商品名字=电视, 商品价格=2000.0]

总结

Comparator和Comparable的区别

Comparator

  • 位于java.util包
  • 在要比较的类的外部实现该接口
  • 调用sort方法时,要指定 Comparator的实现类

Comparable

  • 位于java.lang包
  • 在要比较的类内实现该接口
  • 调用sort方法时,只需要指定集合名即可

对于Comparator

  1. 实现要比较的类
  2. 实现Comparator接口
  3. 测试

对于Comparable

  1. 定义要比较的类,并在类内实现Comparable接口
  2. 测试

以上是关于从零开始的Java开发1-6-1 集合排序:对整型和字符串Comparator接口Comparable接口的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的JAVA -3. java的数据类型

从零开始的Java开发1-6-5 集合综合案例:播放器管理

C语言. .编写一个Sort函数,完成对整型数组元素升序排列。

不创建第三方变量对整型数组逆置

C语言之qsort函数进行排序

Java开发从零开始!java游戏服务器开发教程