Java常用工具类—集合排序

一、集合排序概述

1、主要内容

  1. 集合中的基本数据类型排序
  2. 集合中的字符串排序
  3. Comparator接口
  4. Comparable接口

回顾:

//数组的排序
int[] arr= {2,3,4,5,2,1};
Arrays.sort(arr);

2、集合排序方法

  1. 使用Collections类的sort(List list)方法
  2. sort(List list)是根据元素的自然顺序对指定列表按升序进行排序。

二、对基本数据类型和字符串类型进行排序

1、对基本数据类型排序

List中只能存放对象,要想存放基本数据类型的话,泛型中只能写其对应的包装类。

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

public class IntSort {

	public static void main(String[] args) {
		//对存储在List中的整形数据进行排序
		List<Integer> list = new ArrayList<Integer>();
		list.add(5);
		list.add(9);
		list.add(3);
		list.add(1);
		System.out.println("排序前:");
		for (int n: list) {
			System.out.print(n + " ");
		}
		System.out.println();
		//对List中的数据进行排序
		Collections.sort(list);
		System.out.println("排序后:");
		for (int n: list) {
			System.out.print(n + " ");
		}
	}

}

2、对字符串排序

集合中字符串的排序后其实是按字符顺序,ASCII值顺序进行排序的

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 str: list) {
			System.out.print(str + " ");
		}
		System.out.println();
		//对List中的数据进行排序
		Collections.sort(list);
		System.out.println("排序后: ");
		for (String str: list) {
			System.out.print(str + " ");
		}
		//排序后其实是按字母顺序
	}

}

三、Comparator接口

1、问题场景:

自定义的类如何排序?

2、解决方法:

使用Comparable或Comparator接口

3、Comparator接口介绍

  1. 强行对某个对象进行整体排序的比较函数
  2. 可以将Comparator传递给sort方法(如Collections.sort或 Arrays.sort)
  3. 包含方法int compare(T o1, T o2) 比较用来排序的两个参数  –如果o1<o2,返回负整数   –如果o1==o2,返回0  –如果o1>o2,返回正整数
  4. 包含方法boolean equals(Object obj)指示某个其他对象是否“等于”此Comparator。此方法可以被Object类中的equals方法覆盖,不必重写,也就是说,我们在Comparator接口中只需要重写compare这个方法。

4、对宠物猫进行排序

对自定义的类按照一定的规则进行排序:
(1)对宠物猫按名字进行排序
String类型具有compareTo()方法

例:

int n = name1.conpareTo(name2);

如果name1<name2时,那么n是负整数,相等则为0,否则为正整数。
name1与name2位置调换下,则会实现倒序的排序。

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

}

语法格式:

Collections.sort(catList, new NameComparator());

(2)对宠物猫按年龄降序排序

  1. 调用compare方法大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的升序了。如果第二个参数与第一个参数调换顺序,也就是降序了。
  2. 按int类型比较,直接返回减法后的差值。
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;
	}

}

语法格式:

Collections.sort(catList, new AgeComparator());

四、Comparable接口

1、Comparable概述

  1. Comparable接口位于Java.lang包下面
  2. 此接口强行对实现他的每个类的对象进行整体排序
  3. 这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法
  4. 对于集合,通过调用Collection.sort方法进行排序
  5. 对于数组,通过调用Arrays.sort方法进行排序
  6. int compareTo(T o)方法:该对象小于,等于或大于指定对象,则分别返回负整数,0,或正整数

2、对商品价格进行降序排序案例

(1)操作步骤

  1. 对待排序的类进行接口实现
  2. 重写compareTo方法
  3. 直接调用Collections.sort()方法。

(2)代码实现
①商品类的定义

public class Goods implements Comparable<Goods> { //实现Comparable接口,利用泛型限定比较的类型
	private String id; //商品编号
	private String name; //商品名称
	private double price; //商品价格
	//构造方法
	public Goods() {

	}
	public Goods(String id, String name, double price) {
		this.setId(id);
		this.setName(name);
		this.setPrice(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;
	}

	@Override
	public String toString() {
		return "商品编号:" + id + ",商品名称:" + name + ",商品价格:" + price;
	}

	@Override
	public int compareTo(Goods o) {  //重写compareTo方法。
		//取出商品价格
		double price1 = this.getPrice();
		double price2 = o.getPrice();
		int n = new Double(price2 - price1).intValue();  //double类型的差值转为int
		return n;
	}

②排序步骤

Collections.sort(goodsList);

五、集合排序总结

Comparator和Comparable接口的区别

1、Comparator:

①位于java.util包
②在要比较的类的外部实现该接口
③调用sort方法时,要指定Comparator的实现类
使用顺序:

  1. 实现要排序的接口
  2. 实现comparator接口
  3. 测试

2、Comparable

①位于java.lang包
②在要比较的类上实现该接口
③调用sort方法时,只需指定集合名即可
使用顺序:

定义要比较的类,并实现comparable接口
测试

以上所述是小编给大家介绍的Java集合排序详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 4位吸血鬼数字的java实现思路与实例讲解

    这个问题来源于Java编程思想一书,所谓"吸血鬼数字"就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列.例如: 1260=21*60,1827=21*87,2187=27*81-- 先列出结果: 一共7个: 1260=21*60,1395=15*93,1435=41*35,1530=51*30,1827=87*21,2187=27*81,6880=86*80 第一种思路对所有的4位数进行穷举,假设这个4位数是a

  • 详解JAVA中的Collection接口和其主要实现的类

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的"子接口"如List和Set,详细信息可见官方文档http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/

  • 详解Java包装类及自动装箱拆箱

    Java包装类 基本类型 大小 包装器类型 boolean / Boolean char 16bit Boolean byte 8bit Byte short /16bit Short int 32bit Integer long 64bit Long float 32bit Float double 64bit Double void / Void Java 的包装类有两个主要的目的: Java包装类将基本数据类型的值"包装"到对象中,对基本数据类型的操作变为了对对象进行操作,从而使

  • Java BigInteger类,BigDecimal类,Date类,DateFormat类及Calendar类用法示例

    本文实例讲述了Java BigInteger类,BigDecimal类,Date类,DateFormat类及Calendar类用法.分享给大家供大家参考,具体如下: BigInteger类 发 package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进行运算 * * 构造方法: * BigInteger(String val) */ public class BigIntegerDe

  • 详解Java引用类型的参数也是值传递

    简述 调用方法的时候,有需要传参数的情况.在Java中,参数的类型有基本类型和引用类型两种. 一开始听到一个说法,Java没有引用传递,但是一直没有太多的思考在上面,直到前不久玩数组的时候,突然间发现把数组引用变量作为参数传递到一个方法当中进行操作之后,再去访问原数组,尽然改变了.于是乎,就想到了之前在C++里面学过的引用传递,突然有一种错愕的感觉,就查了一些资料,探究当Java引用类型变量作为参数传递给方法的时候,到底是值传递还是引用传递. 结论:如果将Java引用类型变量作为参数传递给方法,

  • Javascript的this详解

    在理解javascript的this之前,首先先了解一下作用域. 作用域分为两种: 1.词法作用域:引擎在当前作用域或者嵌套的子作用域查找具有名称标识符的变量.(引擎如何查找和在哪查找.定义过程发生在代码书写阶段) 2.动态作用域:在运行时被动态确定的作用域. 词法作用域和动态作用域的区别是:词法作用域是在写代码或定义时确定的:动态作用域是在运行时确定的. this的绑定规则 this是在调用时被绑定,取决于函数的调用位置.由此可以知道,一般情况下(非严格模式下),this都会根据函数调用(调用

  • 浅谈java String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; } java 9 及之后:(使用coder标识了编码) public final class Stri

  • 深入理解Java多线程与并发编程

    一.多线程三大特性 多线程有三大特性:原子性.可见性.有序性. 原子性 (跟数据库的事务特性中的原子性类似,数据库的原子性体现是dml语句执行后需要进行提交): 理解:即一个操作或多个操作,要么全部执行并且执行的过程中不会被任何因素打断,要么都不执行. 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元.这2个操作必须要具备原子性才能保证不出现一些意外的问题. 我们操作数据也是如此,比如i = i+1:其

  • 详解Java中Thread 和Runnable区别

    Thread 和Runnable 关系 Thread类是接口Runnable的一个实现类. public class Thread implements Runnable 源码分析 Thread Threa类运行的时候调用start()方法,源代码如下: 调用start()方法,实际运行的是start0方法,方法声明如下: private native void start0() native表明这个方法是个原生函数,即这个函数是用C/C++实现的,被编译成DLL,由Java调用. native

  • Java中缀表达式转后缀表达式实现方法详解

    本文实例讲述了Java中缀表达式转后缀表达式实现方法.分享给大家供大家参考,具体如下: 本文先给出思路与方法,最后将给出完整代码 项目实战: https://www.jb51.net/article/158335.htm 算法综述: 一.中缀表达式转后缀表达式: 1.中缀表达式要转后缀表达式,首先需要两个Stack(栈),其中一个应用于存放字符,另一个用于存放数字. 2.读到数字直接存入数字栈中,读到字符时,要咸鱼栈内前一元素(字符)进行比较,当当前(要存入的字符)优先级大于迁移字符时才存入,否

随机推荐