当前位置:首页 > Java技术 > Java学习-Collections工具类和Java常见的几种比较器

Java学习-Collections工具类和Java常见的几种比较器

2022年08月05日 18:38:56Java技术6

1、Collections集合工具类

1.1基本介绍

java.utils.Collections 是 Java 提供的一个操作 SetListMap 等集合的工具类。Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制 等操作。

1.2Collections常用方法

排序(正向和逆向)
Collections 提供了如下方法用于对 List 集合元素进行排序。

void reverse(List list):
对指定 List 集合元素进行逆向排序。

void shuffle(List list):
对 List 集合元素进行随机排序(shuffle 方法模拟了“洗牌”动作)。

void sort(List list):
根据元素的自然顺序对指定 List 集合的元素按升序进行排序。

void sort(List list, Comparator c):
根据指定 Comparator 产生的顺序对 List 集合元素进行排序。

void swap(List list, int i, int j):
将指定 List 集合中的 i 处元素和 j 处元素进行交换。

void rotate(List list, int distance):
当 distance 为正数时,将 list 集合的后 distance 个元素“整体”移到前面;当 distance 为负数时,
将 list 集合的前 distance 个元素“整体”移到后面。该方法不会改变集合的长度。
import java.util.ArrayList;
import java.util.Collections;
public class test{
     
	public static void main(String []args)
	{
     
		ArrayList<Integer> list = new ArrayList<Integer>(); 
		list.add(13); 
		list.add(2); 
		list.add(35); 
		list.add(24); 
		System.out.println(list);
		//对指定 List 集合元素进行逆向排序。
		Collections.reverse(list);
		System.out.println(list);
		//对 List 集合元素进行随机排序(shuffle 方法模拟了“洗牌”动作)
		Collections.shuffle(list);
		System.out.println(list);
		//根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
		Collections.sort(list);
		System.out.println(list);
		//将指定 List 集合中的 i 处元素和 j 处元素进行交换。
		Collections.swap(list, 2, 3);
		System.out.println(list);
		//将集合后2个元素移到前面
		Collections.rotate(list, 2);
		System.out.println(list);
		//将集合前3个元素移到后面
		Collections.rotate(list, -3);
		System.out.println(list);		
	}
}
[13, 2, 35, 24]
[24, 35, 2, 13]
[2, 13, 35, 24]
[2, 13, 24, 35]
[2, 13, 35, 24]
[35, 24, 2, 13]
[13, 35, 24, 2]

查找、替换
Collections 还提供了如下常用的用于查找、替换集合元素的方法。

int binarySearch(List list, Object key):
使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态。

Object max(Collection coll):
根据元素的自然顺序,返回给定集合中的最大元素。

Object max(Collection coll, Comparator comp):
根据 Comparator 指定的顺序,返回给定集合中的最大元素。

Object min(Collection coll):
根据元素的自然顺序,返回给定集合中的最小元素。

Object min(Collection coll, Comparator comp):
根据 Comparator 指定的顺序,返回给定集合中的最小元素。

void fill(List list, Object obj):
使用指定元素 obj 替换指定 List 集合中的所有元素。

int frequency(Collection c, Object o):
返回指定集合中指定元素的出现次数。

int indexOfSubList(List source, List target):
返回子 List 对象在父 List 对象中第一次出现的位置索引;如果父 List 中没有出现这样的子 List,则返回 -1int lastIndexOfSubList(List source, List target):
返回子 List 对象在父 List 对象中最后一次出现的位置索引;如果父 List 中没有岀现这样的子 List,则返回 -1boolean replaceAll(List list, Object oldVal, Object newVal):
使用一个新值 newVal 替换 List 对象的所有旧值 oldVal。
import java.util.ArrayList;
import java.util.Collections;
public class test{
     
	public static void main(String []args)
	{
     
		ArrayList<Integer> list = new ArrayList<Integer>(); 
		list.add(13); 
		list.add(2); 
		list.add(35); 
		list.add(24); 
		System.out.println(list);
		//先按升序排序
		Collections.sort(list);
		System.out.println(list);
		//用二分搜索法搜索24返回其索引
		int index = Collections.binarySearch(list, 24);
		System.out.println(index);
		//返回集合中最大元素
		int max = Collections.max(list);
		System.out.println(max);
		//使用38替换集合中的35
		Collections.replaceAll(list, 35, 38);
		System.out.println(list);
		//返回24元素在集合中出现的次数
		int num =Collections.frequency(list, 24);
		System.out.println(num);
	}
}
[13, 2, 35, 24]
[2, 13, 24, 35]
2
35
[2, 13, 24, 38]
1

2、Java的比较器

2.1常用比较方法介绍

对于JDK8而言,有三种实现对象比较的方法:
1、覆写Object类的equals()方法;
2、继承Comparable接口并实现compareTo()方法;
3、定义一个单独的对象比较器,继承自Comparator接口实现compare()方法。
由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。

2.2Comparable比较器

java.lang.Comparable接口,是一个给排序方法使用的接口, 这是一个自比较器接口。用于指定一个对象如何去比较大小。

方法:

int compareTo(T obj) :比较当前对象与传入进来对象的大小
参数:obj 表示要比较的对象返回值:
    *如果当前的对象大于obj,返回正整数。
    *如果当前的对象等于obj,返回0
    *如果当前对象小于obj,返回负整

当排序的sort()方法在对集合中的元素两两进行比较的时候会调用我们实现的compareTo(T obj)方法。
如果compareTo()返回正整数,则表示当前元素大于和它比较的元素;
如果返回负整数则表示当前元素小于和它比较的元素;
如果返回0,则表示两者相等。

例:创建一个员工类,存储到ArrayList集合中并根据员工的工资进行升序排序操作

import java.util.ArrayList;
import java.util.Collections;
class Employee implements Comparable<Employee> {
     
    private int id;
    private String name;
    private int salary;
    public Employee(int id,String name,int salary)
    {
     
    	this.id=id;
    	this.name=name;
    	this.salary=salary;
    }
   @Override
    public int compareTo(Employee o) {
       //告诉sort()方法比较规则
        return this.salary-o.salary;//工资升序
    }
   public String toString() 
   {
      
	   return "employee{" + "id='" + id+ '\'' + ", name=" + name + '\'' + ",salary="+salary+'}';
	}
}
public class test{
     
    public static void main(String[] args) {
     
    	ArrayList<Employee> list = new ArrayList<Employee>();
    	list.add(new Employee(1, "张三",7000)); 
    	list.add(new Employee(2, "李四",5000)); 
    	list.add(new Employee(3, "王五",6000)); 
       System.out.println("排序前:");
        for (Employee employee : list) {
     
            System.out.println(employee);
        }
        //排序
      //要求 该list中元素类型 必须实现比较器Comparable接口
        Collections.sort(list);
        System.out.println("排序后:");
        for (Employee employee : list) {
     
            System.out.println(employee);
        }
    }
}

2.3Comparator比较器

java.util.Comparator接口,创建一个比较器的接口,一个类实现这个接口,相当于指定了一个排序的规则。

Comparator接口中的方法

public int compare(String o1, String o2) :
比较o1和o2这两个对象如果:
    obj1 > obj2,这个方法返回正整数
    obj2 == obj1, 返回0
    obj1 < obj2,这个方法返回负整数

例:创建一个员工类,存储到ArrayList集合中并分别写一个Id比较器接口根据Id升序排列
和一个Salary比较器根据Salary升序排列

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Employee implements Comparable<Employee> {
     
    private int id;
    private String name;
    private int salary;
    public int getId() {
     
		return id;
	}
	public void setId(int id) {
     
		this.id = id;
	}
	public int getSalary() {
     
		return salary;
	}
	public void setSalary(int salary) {
     
		this.salary = salary;
	}
	public Employee(int id,String name,int salary)
    {
     
    	this.id=id;
    	this.name=name;
    	this.salary=salary;
    }
   @Override
    public int compareTo(Employee o) {
       //告诉sort()方法比较规则
        return this.salary-o.salary;//工资升序
    }
   public String toString() 
   {
      
	   return "employee{" + "id='" + id+ '\'' + ", name=" + name + '\'' + ",salary="+salary+'}';
	}
}
//Id比较器
class IdComparator implements Comparator<Employee> {
     
  @Override
  public int compare(Employee o1, Employee o2) {
     
      return o1.getId()-o2.getId();//根据Id升序
  }
}
//salary比较器
class SalaryComparator implements Comparator<Employee> {
     
  @Override
  public int compare(Employee o1, Employee o2) {
     
      return o1.getSalary()-o2.getSalary();//根据salary升序
  }
}
public class test{
     
    public static void main(String[] args) {
     
    	ArrayList<Employee> list = new ArrayList<Employee>();
    	list.add(new Employee(1, "张三",7000)); 
    	list.add(new Employee(4, "李四",5000)); 
    	list.add(new Employee(3, "王五",6000)); 
    	list.add(new Employee(2, "谢六",3000));
       System.out.println("排序前:");
        for (Employee employee : list) {
     
            System.out.println(employee);
        }
        //根据Id比较器排序
        Collections.sort(list, new IdComparator());
        System.out.println("根据Id排序后:");
        for (Employee employee : list) {
     
            System.out.println(employee);
        }
        //根据Salary比较器排序
        Collections.sort(list, new SalaryComparator());
        System.out.println("根据Salary排序后:");
        for (Employee employee : list) {
     
            System.out.println(employee);
        }
    }
}
排序前:
employee{
     id='1', name=张三',salary=7000}
employee{
     id='4', name=李四',salary=5000}
employee{
     id='3', name=王五',salary=6000}
employee{
     id='2', name=谢六',salary=3000}
根据Id排序后:
employee{
     id='1', name=张三',salary=7000}
employee{
     id='2', name=谢六',salary=3000}
employee{
     id='3', name=王五',salary=6000}
employee{
     id='4', name=李四',salary=5000}
根据Salary排序后:
employee{
     id='2', name=谢六',salary=3000}
employee{
     id='4', name=李四',salary=5000}
employee{
     id='3', name=王五',salary=6000}
employee{
     id='1', name=张三',salary=7000}

扩展:如果在使用的时候,想要独立的定义规则去使用 可以采用Collections.sort(List list,Comparetor c)方式,自己定义 规则:
比如上面的代码直接写成:

Collections.sort(list, new Comparator<Employee>() 
{
      
	@Override 
	public int compare(Employee o1, Employee o2) 
	{
     
      return o1.getId()-o2.getId();//根据Id升序
  	}
});
Collections.sort(list, new Comparator<Employee>() 
{
      
	@Override 
	public int compare(Employee o1, Employee o2) 
	{
     
      return o1.getSalary()-o2.getSalary();//根据salary升序
  	}
});

2.4Comparable和Comparator的区别

Comparable & Comparator 都是用来实现集合中的排序的,
只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。

  1. Comparable位于包java.lang下,Comparator位于包java.util下。
    Comparable接口将比较代码嵌入自身类中,而Comparator在一个独立的类中实现比较
  2. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,
    可以通过Comparator 来实现比较算法进行排序。
  3. Comparator为了使用不同的排序规则做准备。比如:升序、降序或按不同的属性进行排序。

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法 被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现 此接口的对象列表(和数组)可以通过

Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。 Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

欢迎阅读Java集合的相关博客:
Java学习-Collection集合和Iterator迭代器
Java学习-详谈泛型
Java学习-详谈List集合(ArrayList、LinkedList、Vector和Stack)
Java学习-详谈Set集合(HashSet、TreeSet、LinkedHashSet)
Java学习-详谈Map集合(HashMap、LinkedHashMap、TreeMap)

欢迎持续关注!
我的CSDN主页
个人博客站:jQueryZK Blog

作者:jQueryZK
来源链接:https://blog.csdn.net/weixin_44279178/article/details/108511537

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/17671.html

分享给朋友:

“Java学习-Collections工具类和Java常见的几种比较器” 的相关文章

Java 常用工具类(21) : 计算百分比,去整数/小数

import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; /** * @Auther: liyue * @Date: 2018/8/31 15:31...

MD5工具类(java实现版)

MD5工具类(java实现版) 介绍 MD5(Message Digest Algorithm)加密算法是不对称的加密算法,因为其实不可逆的,实际上其不能算作加密算法, 因为其不可解密。其实现原理是基于Hash算法(简称散列函数)。...

Java IO工具类常用方法

常用的文件操作:包括文件拷贝、HTTP方式拷贝、文件下载等。  1.创建文件夹 /** * 创建文件夹 * @filePath:路径 */ public void MakeFolder(String folderPath){ File fi...

12款最常用的Java测试工具

Parasoft Jtest Jtest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。 Abbot Abbot是一款测试Java GUIs的JUnit扩展程序...

java中常用的日期工具类

java中常用的日期工具类

java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util; import java.text.ParseException; import java.text.SimpleDateF...

JAVA常用工具类记录

JAVA常用工具类记录 新旧知识 常用 工具类 JAVA 15747979 一、JDK 工具类...

三、Java基础工具(1)_常用类——系统相关类

2018-05-12   系统相关类   查阅API 一、System类   表示系统的意思     1、arraycopy方法     public static void arraycopy(Obj...

209 01 Android 零基础入门  03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结

209 01 Android 零基础入门 03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结

209 01 Android 零基础入门 03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结 本文知识点:集合知识点总结 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进行了截图记录,没有对截图步骤进行详细的文字说明(后面博主时间...

扩展:JAVA 常用框架和工具思维导图

扩展:JAVA 常用框架和工具思维导图

作者:He BianGu 来源链接:https://blog.csdn.net/u010975589/article/details/80885509...

java常用工具类组件 总结

常用组件 json操作: fastjson,jackson,gson md5等:commons-codec 工具集合:guava 数组操作:ArrayUtils(org.apache.commons.lang3.Array...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。