当前位置: 首页 > news >正文

Collections类(笔记)

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>() {@Overridepublic int compare(Integer o1, Integer o2) {//升序:o1-o2return o1-o2;}});System.out.println(list01);//[1, 2, 3, 4, 5, 6]//Collections.sort(list01, new ComparatorImpl());Collections.sort(list01, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {//降序:o2-o1return 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>() {@Overridepublic int compare(String o1, String o2) {//先按照字符串的第一个字符进行降序排序int a =  o2.charAt(0)-o1.charAt(0);//'a'-'A'==>97-65if(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>() {@Overridepublic 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>() {@Overridepublic 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集合对象,泛型使用PersonArrayList<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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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集合对象,泛型使用PersonArrayList<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集合对象,泛型使用PersonArrayList<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>() {@Overridepublic int compare(Person o1, Person o2) {//年龄升序排序return o1.getAge()-o2.getAge();}});System.out.println(list);//按照两个人的年龄升序排序,如果两个人的年龄相同,按照姓名的首字母降序排序Collections.sort(list, new Comparator<Person>() {@Overridepublic 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>() {@Overridepublic 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;}@Overridepublic 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:550int 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集合工具类中的方法addAllstatic <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);}
}

http://www.taodudu.cc/news/show-7665443.html

相关文章:

  • python中的 collections 模块(用法、详解、底层原理,示例等)
  • Collections类详解
  • grant 命令
  • mysql grant 所有权限_mysql之grant权限说明
  • mysql 取消grant_MySQL中授权(grant)和撤销授权(revoke)
  • oracle数据库grant用法,Oracle初学者之grant授权
  • pm grant 命令
  • 第四十八章 SQL命令 GRANT(二)
  • mysql grant on_Mysql权限管理grant命令使笔记
  • oracle view grant,view需要with grant option的情况
  • mysql grant 权限修改_mysql grant用户权限设置
  • mysql授权用户grant所有权限
  • mysql用grant_mysql中grant用法介绍
  • oracle grant的用法,Oracle 用户权限 Grant
  • mysql grant select()_mysql grant命令
  • mysql grant命令详解_mysql grant命令详解
  • 20.grant的用法(权限的授权)
  • 常用Java工具类:手机号脱敏,身份证号脱敏
  • java工具之解析yaml文件
  • Java 脱敏工具类总结
  • java工具类static静态方法读取yml配置
  • Java DecimalFormat用法
  • Android DecimalFormat 格式化数字
  • DecimalFormat(double转为String时数据过小或者过大自动转为科学计数法问题)
  • JDBC和Statement的使用
  • java.sql.statement_Java使用Statement接口执行SQL语句操作实例分析
  • JDBC的Statement对象的使用
  • java statement 参数_JDBC中Statement和Preparement的使用讲解
  • Unreachable statement
  • BUUCTF,Crypto:Cipher