1.Collections的常用功能(重点)
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.出现的问题
3.问题的分析
4.问题解决办法
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方法不在报错
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.可变参数
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);
}
}