Collections类(笔记)

2023-05-16

1.Collections的常用功能(重点)

import java.util.Collections;
java.util.Collections是集合工具类,用来对集合进行操作。
常用方法如下:
- public static void shuffle(List<?> list):打乱集合中元素顺序。
- public static void sort(List list):根据元素的自然顺序 对指定列表按升序进行排序。
注意:
以上两个方法的参数,只能传递List集合,对List集合进行排序|打乱顺序
不能传递Set集合

package com.itheima.demo01Collections;

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

/*
    java.util.Collections是集合工具类,用来对集合进行操作。
      常用方法如下:
    - public static void shuffle(List<?> list):打乱集合中元素顺序。
    - public static <T> void sort(List<T> list):根据元素的自然顺序 对指定列表按升序进行排序。
    注意:
        以上两个方法的参数,只能传递List集合,对List集合进行排序|打乱顺序
        不能传递Set集合
 */
public class Demo01Collections {
    public static void main(String[] args) {
        ArrayList<Integer> list01 = new ArrayList<>();
        list01.add(1);
        list01.add(3);
        list01.add(5);
        list01.add(6);
        list01.add(4);
        list01.add(2);
        System.out.println(list01);//[1, 3, 5, 6, 4, 2]

        //public static <T> void sort(List<T> list):根据元素的自然顺序对指定集合按升序进行排序。
        //升序:小==>大  降序:大==>小
        Collections.sort(list01);
        System.out.println(list01);//[1, 2, 3, 4, 5, 6]

        //public static void shuffle(List<?> list):[随机]打乱集合中元素顺序。
        Collections.shuffle(list01);
        System.out.println(list01);//[4, 3, 6, 2, 5, 1] [2, 6, 3, 4, 5, 1] [4, 5, 3, 2, 6, 1] [6, 1, 4, 5, 2, 3]

        ArrayList<String> list02 = new ArrayList<>();
        list02.add("aa");
        list02.add("AA");
        list02.add("AD");
        list02.add("bb");
        list02.add("12");
        list02.add("ab");
        System.out.println(list02);//[aa, AA, AD, bb, 12, ab]
        Collections.sort(list02);//自然顺序:编码表的顺序
        System.out.println(list02);//[12, AA, AD, aa, ab, bb]
    }
}

2.Comparator比较器(重点)(是一个接口)

  • 方法:

在这里插入图片描述

在这里插入图片描述

package com.itheima.demo01Collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
    static <T> void sort(List<T> list, Comparator<? super T> c) 根据指定[比较器产生的顺序]对指定集合进行排序。
    参数:
        List<T> list:传递要排序的List集合
        Comparator<? super T> c:比较器
    java.util.Comparator<T> 接口:强行对某个集合进行整体排序的比较函数。
    成员方法:
        int compare(T o1, T o2) 比较用来排序的两个参数。
    参数:
        T o1, T o2:会依次获取到集合中相邻的两个元素
    排序的规则:
        o1-o2:升序排序
        o2-o1:降序排序
        o1==o2:两个元素相等
 */
public class Demo02Collections {
    public static void main(String[] args) {
        ArrayList<Integer> list01 = new ArrayList<>();
        list01.add(1);
        list01.add(3);
        list01.add(5);
        list01.add(6);
        list01.add(4);
        list01.add(2);
        System.out.println(list01);//[1, 3, 5, 6, 4, 2]

        //static <T> void sort(List<T> list, Comparator<? super T> c) 根据指定[比较器产生的顺序]对指定集合进行排序。
        Collections.sort(list01, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //升序:o1-o2
                return o1-o2;
            }
        });
        System.out.println(list01);//[1, 2, 3, 4, 5, 6]

        //Collections.sort(list01, new ComparatorImpl());
        Collections.sort(list01, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //降序:o2-o1
                return o2-o1;
            }
        });
        System.out.println(list01);//[6, 5, 4, 3, 2, 1]
    }
}

在这里插入图片描述
字符串自定义排序规则

package com.itheima.demo01Collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Demo03Collections {
    public static void main(String[] args) {
        ArrayList<String> list02 = new ArrayList<>();
        list02.add("aa");
        list02.add("AA");
        list02.add("AD");
        list02.add("bb");
        list02.add("12");
        list02.add("ab");
        Collections.sort(list02, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //先按照字符串的第一个字符进行降序排序
                int a =  o2.charAt(0)-o1.charAt(0);//'a'-'A'==>97-65
                if(a==0){
                    //首字母相等,在按照第二个字母降序排序
                    a = o2.charAt(1)-o1.charAt(1);
                }
                return a;
            }
        });
        System.out.println(list02);//[bb, ab, aa, AD, AA, 12]

        Collections.sort(list02, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                /*
                    String类成员方法:
                        int compareTo(String anotherString)
                            按字典(编码表)顺序比较两个字符串。
                 */
                //字符串降序排序
                return o2.compareTo(o1);
            }
        });
        System.out.println(list02);//[bb, ab, aa, AD, AA, 12]

        Collections.sort(list02, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //字符串升序
                return o1.compareTo(o2);
            }
        });
        System.out.println(list02);//[12, AA, AD, aa, ab, bb]
    }
}

🎗经验分享

1.已知使用Collections中的sort代码

public class Demo04Collections {
    public static void main(String[] args) {
        //创建AarrayList集合对象,泛型使用Person
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("azhangsan",18));
        list.add(new Person("lisi",20));
        list.add(new Person("wangwu",19));
        list.add(new Person("zhaoliu",18));
        list.add(new Person("tianqi",21));

        Collections.sort(list);
    }
}
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2.出现的问题

集合的泛型使用Person,会报错
在这里插入图片描述

3.问题的分析

因为Person没有实现Comparable接口
我们之所以可以对Integer类型的集合,Double类型的集合,String类型的集合等,进行排序
是因为这些类Integer,Double,String等,实现了Comparable接口,重写了Comparable接口中的compareTo排序方法
在这里插入图片描述

4.问题解决办法

第一种解决办法:
使用Person类实现Comparable接口重写compareTo排序方法

package com;

public class Person implements Comparable<Person>{
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        //比较两个人的年龄一个是this,一个是参数Person o
        //return this.age - o.age;//按照年龄升序
        return o.age - this.age;//按照年龄降序
    }
}
package com;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Demo01Collections {
    public static void main(String[] args) {
        //创建AarrayList集合对象,泛型使用Person
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("azhangsan",18));
        list.add(new Person("lisi",20));
        list.add(new Person("wangwu",19));
        list.add(new Person("zhaoliu",18));
        list.add(new Person("tianqi",21));

        Collections.sort(list);

        System.out.println(list);
    }
}

程序运行结果(降序排序):有了排序规则sort方法不在报错
在这里插入图片描述
在这里插入图片描述

第二种解决办法:
Person不实现Comparable
可以使用带比较器的sort方法,自己写比较的规则

static void sort(List list, Comparator<? super T> c) 根据指定比较器产生的顺序对指定集合进行排序。
参数:
List list:要排序的List集合
Comparator<? super T> c:对集合进行排序的比较器
java.utl.Comparator接口:强行对某个对象 collection 进行整体排序 的比较函数。
Comparator接口中的抽象方法:
int compare(T o1, T o2) 比较用来排序的两个参数。
参数:
T o1, T o2:内部自动获取的集合中的元素[1,2,3,4]
比较的规则(重点):
升序:o1-o2
降序:o2-o1
两个元素相等:o1==o2

public class Demo01Collections {
    public static void main(String[] args) {		
		//创建AarrayList集合对象,泛型使用Person
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("azhangsan",18));
        list.add(new Person("lisi",20));
        list.add(new Person("wangwu",19));
        list.add(new Person("zhaoliu",18));
        list.add(new Person("tianqi",21));

        //使用Collections集合工具类中的方法sort,对集合中的元素根据比较器产生的规则排序(年龄升序排序)
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //年龄升序排序
                return o1.getAge()-o2.getAge();
            }
        });
        System.out.println(list);

        //按照两个人的年龄升序排序,如果两个人的年龄相同,按照姓名的首字母降序排序
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //按照两个人的年龄升序排序
                int a = o1.getAge()-o2.getAge();
                //判断两个人的年龄是否相等
                if(a==0){
                    //按照姓名的首字母降序排序
                    a = o2.getName().charAt(0) - o1.getName().charAt(0);
                }
                return a;
            }
        });
        System.out.println(list);

        //按照两个人的年龄升序排序,如果两个人的年龄相同,按照姓名进行降序排序
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //按照两个人的年龄升序排序
                int a = o1.getAge()-o2.getAge();
                //判断两个人的年龄是否相等
                if(a==0){
                    //按照姓名进行降序排序
                    /*
                        String类中的方法
                            int compareTo(String anotherString)按字典顺序(编码表的顺序)比较两个字符串。
                            会取出两个字符串中的每个字符,依次比较
                     */
                    a = o2.getName().compareTo(o1.getName());
                }
                return a;
            }
        });
        System.out.println(list);
    }
}
package com;

public class Person{
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

程序运行结果:
在这里插入图片描述
3.可变参数

/*
可变参数:
是JDK1.5之后出现的新特性
作用:
【作为方法的参数使用,可以接收任意个同种数据类型的参数】
当我们定义一个方法,方法参数的数据类型已经确定了,但是参数的个数不确定,就可以使用可变参数
格式:
修饰符 返回值类型 方法名(数据类型…变量名){
方法体;
}
数据类型…变量名:可变参数
int…a:可以接收任意个int类型的整数(不传递参数,传递1个参数,传递10个参数…传递100个参数…)
String…a:可以接收任意个String类型的整数(不传递参数,传递1个参数,传递10个参数…传递100个参数…)
-------------------------------------------------
注意:可变参数的底层就是一个数组,定义不同长度的数组,来存储传递的不同个数
*/

package com.itheima.demo03variableArgs;

/*
    可变参数:
        是JDK1.5之后出现的新特性
    作用:
        【作为方法的形式参数使用,可以接收任意个同种数据类型的实际参数】
        当我们定义一个方法,方法参数的数据类型已经确定了,但是参数的个数不确定,就可以使用可变参数
    格式:
        修饰符 返回值类型 方法名(数据类型...变量名){
            方法体;
        }
    数据类型...变量名:可变参数
    int...a:可以接收任意个int类型的整数(不传递参数,传递1个参数,传递10个参数....传递100个参数...)
    String...a:可以接收任意个String类型的字符串(不传递参数,传递1个参数,传递10个参数....传递100个参数...)
    -------------------------------------------------
    注意:可变参数的底层就是一个数组,定义不同长度的数组,来存储传递的不同个数
 */
public class Demo01 {
    public static void main(String[] args) {
        //getSum();
        //getSum(10);
        int s1 = getSum(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
        System.out.println("s1:"+s1);//s1:550
        int s2 = getSum(10, 20);
        System.out.println("s2:"+s2);//s2:30
    }

    /*
        定义一个方法,计算n个int类型整数和并返回
        已知:数据类型int
        未知:传递多少个参数
        解决:使用可变参数解决
        --------------------------------------------
        getSum();那么可变参数就会创建一个长度为0的数组,存储数据 int[] a = new int[]{ };
        getSum(10);那么可变参数就会创建一个长度为1的数组,存储数据 int[] a = new int[]{10};
        getSum(10,20);那么可变参数就会创建一个长度为2的数组,存储数据 int[] a = new int[]{10,20};
        ...
        getSum(10,20,30,40,50,60,70,80,90,100);那么可变参数就会创建一个长度为10的数组,
            存储数据 int[] a = new int[]{10,20,30,40,50,60,70,80,90,100};
     */
    public static int getSum(int...a){
        //System.out.println(a);
        //System.out.println(a.length);
        int sum = 0;
        for (int i : a) {
            sum+=i;
        }
        return sum;
    }
    /*
        定义一个方法,计算两四个int类型整数的和并返回
     */
    /*public static int getSum(int a,int b,int c,int d){
        return a+b+c+d;
    }*/

    /*
        定义一个方法,计算两三个int类型整数的和并返回
     */
    /*public static int getSum(int a,int b,int c){
        return a+b+c;
    }*/

    /*
        定义一个方法,计算两个int类型整数的和并返回
     */
    /*public static int getSum(int a,int b){
        return a+b;
    }*/
}

重点:记住可变参数可以接收任意个同种数据类型的元素

package com.itheima.demo03variableArgs;

import java.util.ArrayList;

public class Demo02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        method(10,1.1,list,true,false,true,false,true,true,false);
    }
    
    //可变参数的注意事项
    //1.一个方法的参数列表中只能写一个可变参数
    //public static void method(String...a,int...b){ }
    
    //2.方法的参数列表如果有多个参数,可变参数必须写在末尾
    //Vararg parameter must be the last in the list
    //public static void method(int a, double b,boolean...boo ,ArrayList<String> list){ }
    //public static void method(int a, double b,ArrayList<String> list,boolean...boo){ }
    
    //3.看java底层源码
    //public static void method(Object...obj){}
    public static <T> T[] method(T...t){
        return t;
    }
}

可变参数注意事项:
1.一个方法的参数列表中只能写一个可变参数

2.方法的参数列表如果有多个参数,可变参数必须写在末尾
在这里插入图片描述
3.看java底层源码
在这里插入图片描述
4.Collections集合工具类中的方法addAll
在这里插入图片描述

package com.itheima.demo03variableArgs;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

/*
    Collections集合工具类中的方法addAll
    static <T> boolean addAll(Collection<? super T> c, T... elements)
          将所有指定元素添加到指定 collection 中。
 */
public class Demo03addAll {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        //add一次添加一个元素
        //list.add(1);
        //list.add(2);
        //list.add(3);
        //list.add(4);
        //list.add(5);
        //addAll一次添加多个元素
        Collections.addAll(list,1,2,3,4,5);
        System.out.println(list);

        LinkedList<String> linked = new LinkedList<>();
        Collections.addAll(linked,"aa","bb","jack","rose");
        System.out.println(linked);//[aa, bb, jack, rose]

        HashSet<Double> set = new HashSet<>();
        Collections.addAll(set,1.1,2.2,3.3,4.5,5.5);
        System.out.println(set);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections类(笔记) 的相关文章

随机推荐

  • 一篇文章搞懂Python那些事!!!

    1 python安装 1 1 安装地址 xff1a Download Python Python org 1 2 注意事项 xff1a 安装时需要勾选加入path环境安装后需要将python exe和script两个文件的路径加入path
  • Typora安装和使用技巧

    一 Typora安装 官方下载地址 xff1a https typora io 破解版下载地址 xff1a typora破解版安装 路人张的面试笔记 这里的旧版本是一直支持free xff1a 二 Typora使用技巧 常用快捷键 加粗 x
  • Word模板的创建与设置

    Word模板的创建与设置 1 背景 word作为office的一部分 是微软提供的办公文档写作软件 除了文字编辑的功能之外 它还包含很多提高写作效率的自动化功能 目前已成为办公文档 专业论文写作等必不可少的利器 本文内容涵盖了word自动化
  • TCP 服务器程序突然中断 由于send函数导致

    最近在写tcp 客户端服务器操作 设置服务器为单线程多个客户端连入 开发过程中出现 服务器代码运行过程中 在send处突然中断情况 通过GDB调试发现send函数报错提示打开文件错误 由于测试过程纵单节点反复连入客户端 在client so
  • 我为什么选择Linux mint 21.1 “Vera“ ? Mint安装优化调教指南(分辨率DPI、主题美化)

    前言 xff1a 为什么是Mint 笔者算是Linux老用户了 xff0c 作为一个后端开发 xff0c 尝试了多种不同发行版 一开始是Manjaro这种Arch系 xff0c 但是其对于开发而言实在是太过不稳定 xff1b 每次滚动更新都
  • 常用主题建模方法简单对比LSA&PLSA&LDA&HDP

    几种常用的主题建模方法 潜在语义分析 LSA I 概率潜在语义分析 PLSA 潜在狄利克雷分布 LDA 层次狄利克雷过程 HDP LSA I存在的主要问题 SVD计算非常耗时 xff0c 尤其文本处理 xff0c 词和文本数都是非常大的 x
  • banner2.1新版的使用,图片加载方法

    新版banner没有了设置图片和加载图片的方法 xff0c 弄了好几天才发现要设置适配器才可以使用 使用banner setaAapter方法设置适配器 xff0c 里面创建一个匿名内部类 xff0c 然后继承BannerImageAdap
  • yum解决依赖问题巧用

    1 使用yum查找软件需要用到的依赖包 xff0c 需要使用的命令是 xff1a yum deplist 34 要查找的软件 34 例如要查找 安装 redis 需要 的依赖软件有哪些 xff1a yum deplist redis 2 假
  • ubuntu linux 下载的deb包存放位置

    var cache apt archives
  • VMware快捷启动虚拟机+开机自启动

    场景 需要快速启动vm中的虚拟机服务 实现 编写bat文件 xff08 新建txt文件写完改成 bat文件即可 xff09 span class token string 34 D Dev tools VMware span class t
  • Zookeeper思维导图

  • cnpminstall报错:Connecttimeoutfor5000ms踩坑

    问题 xff1a 安装Head插件 xff0c 执行cnpm install 报错 xff0c 报错如下 xff1a Get binary mirror config latest from https registry npm taoba
  • 解决执行grunt命令报错【Cannot find module 'coffeescript/register'】

    在使用grunt的插件执行grunt命令时报错 xff1a 如图 xff1a 报错信息 xff1a Cannot find module 39 coffeescript register 39 解决办法 xff1a 1 xff1a 删除项目
  • Linux命令(1)

    1 判断一个命令的类型 type xff1a 格式 xff1a type xff08 一个空格 xff09 命令 作用 xff1a 判断该类型是内部还是外部命令 还可以显示该命令文件路径 2 查看一个文件的类型 file 格式 xff1a
  • 关于单链表的理解

    链表是一种物理 存储单元上非连续 非顺序的 存储结构 xff0c 数据元素的逻辑顺序是通过链表中的 指针链接次序实现的 链表由一系列结点 xff08 链表中每一个元素称为结点 xff09 组成 xff0c 结点可以在运行时动态生成 每个结点
  • selinux is active unexpected inconsistency RUN fsck MANUALLY

    启动centos6 5时报错 xff0c 错误主要是 xff1a selinux is active unexpected inconsistency RUN fsck MANUALLY 原因是因为意外关机如断电 xff0c 或者虚拟机中强
  • Linux永久修改主机名

    hostnamectl set hostname xxx
  • 去除重复字母(Java实现)

    题目 去除重复字母 给你一个字符串 s xff0c 请你去除字符串中重复的字母 xff0c 使得每个字母只出现一次 需保证 返回结果的字典序最小 xff08 要求不能打乱其他字符的相对位置 xff09 示例1 输入 xff1a s 61 b
  • JDK介绍(笔记学习)

    JDK介绍 1 JRE和JDK xff08 记忆 xff09 JDK 称为Java开发工具 xff0c 包含了JRE和开发工具 JRE Java运行环境 xff0c 包含了JVM和Java的核心类库 xff08 Java API xff09
  • Collections类(笔记)

    1 Collections的常用功能 重点 import java util Collections java util Collections是集合工具类 xff0c 用来对集合进行操作 常用方法如下 xff1a public stati