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;
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);
Collections.sort(list01);
System.out.println(list01);
Collections.shuffle(list01);
System.out.println(list01);
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);
Collections.sort(list02);
System.out.println(list02);
}
}
2.Comparator比较器(重点)(是一个接口)
package com.itheima.demo01Collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
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);
Collections.sort(list01, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.println(list01);
Collections.sort(list01, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(list01);
}
}
字符串自定义排序规则
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);
if(a==0){
a = o2.charAt(1)-o1.charAt(1);
}
return a;
}
});
System.out.println(list02);
Collections.sort(list02, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
System.out.println(list02);
Collections.sort(list02, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(list02);
}
}
🎗经验分享
1.已知使用Collections中的sort代码
public class Demo04Collections {
public static void main(String[] args) {
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) {
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) {
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) {
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, 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){
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;
public class Demo01 {
public static void main(String[] args) {
int s1 = getSum(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
System.out.println("s1:"+s1);
int s2 = getSum(10, 20);
System.out.println("s2:"+s2);
}
public static int getSum(int...a){
int sum = 0;
for (int i : a) {
sum+=i;
}
return sum;
}
}
重点:记住可变参数可以接收任意个同种数据类型的元素
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);
}
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;
public class Demo03addAll {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
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);
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(使用前将#替换为@)