Collections 类
一、API文档中的Collections类
二、静态方法
- ① 排序
- public static <T extends Comparable<? super T>> void sort(List list):
根据元素的自然顺序对指定列表按升序进行排序 - public static void sort(List list,Comparator<? super T> c):
根据指定比较器产生的顺序对指定列表进行排序 - ② 二分查找
- public static int binarySearch
(List<? extends Comparable<? super T>> list,T key):
使用二分搜索法搜索指定列表,以获得指定对象 - ③ 最大值
- public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll):
根据元素的自然顺序,返回给定 collection 的最大元素 - ④ 逆置
- public static void reverse(List<?> list):反转指定列表中元素的顺序
三、sort方法排序之一:自然排序
- public static <T extends Comparable<? super T>> void sort(List list):
根据元素的自然顺序 对指定列表按升序进行排序 - 已实现Comparable接口的类型对象
package com.collections.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
System.out.println("排序前:");
for (Integer num : list) {
System.out.println(num);
}
Collections.sort(list);
System.out.println("排序后:");
for (Integer num : list) {
System.out.println(num);
}
}
}
***执行结果:***
排序前:
1
10
3
5
9
2
排序后:
1
2
3
5
9
10
- 自定义类对象
//Person.java
package com.collections.demo;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.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 String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person p) {
int num1 = this.age - p.getAge();
int num2 = num1==0 ? this.name.compareTo(p.getName()) : num1;
return num2;
}
}
//CollectionsTest.java
package com.collections.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
Person p1 = new Person("张三", 18);
Person p2 = new Person("李四", 16);
Person p3 = new Person("王五", 19);
Person p4 = new Person("赵六", 15);
Person p5 = new Person("马七", 17);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前:");
for (Person person : list) {
System.out.println(person);
}
Collections.sort(list);
System.out.println("排序后:");
for (Person person : list) {
System.out.println(person);
}
}
}
***执行结果:***
排序前:
Person [name=张三, age=18]
Person [name=李四, age=16]
Person [name=王五, age=19]
Person [name=赵六, age=15]
Person [name=马七, age=17]
排序后:
Person [name=赵六, age=15]
Person [name=李四, age=16]
Person [name=马七, age=17]
Person [name=张三, age=18]
Person [name=王五, age=19]
四、sort方法排序之二:比较器排序
- public static void sort(List list,Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序
//Person.java
package com.collections.demo;
public class Person2 {
private String name;
private int age;
public Person2() {
super();
}
public Person2(String name, int age) {
super();
this.name = name;
this.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 String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
//CollectionsTest3.java
package com.collections.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CollectionsTest3 {
public static void main(String[] args) {
List<Person2> list = new ArrayList<Person2>();
Person2 p1 = new Person2("张三", 18);
Person2 p2 = new Person2("李四", 16);
Person2 p3 = new Person2("王五", 19);
Person2 p4 = new Person2("赵六", 15);
Person2 p5 = new Person2("马七", 17);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前:");
for (Person2 person : list) {
System.out.println(person);
}
Collections.sort(list, new Comparator<Person2>() {
//匿名内部类
@Override
public int compare(Person2 p1, Person2 p2) {
int num1 = p1.getAge() - p2.getAge();
int num2 = num1==0 ? p1.getName().compareTo(p2.getName()) : num1;
return num2;
}
});
System.out.println("排序后:");
for (Person2 person : list) {
System.out.println(person);
}
}
}
***执行结果:***
排序前:
Person [name=张三, age=18]
Person [name=李四, age=16]
Person [name=王五, age=19]
Person [name=赵六, age=15]
Person [name=马七, age=17]
排序后:
Person [name=赵六, age=15]
Person [name=李四, age=16]
Person [name=马七, age=17]
Person [name=张三, age=18]
Person [name=王五, age=19]
五、二分查找binarySearch
- public static int binarySearch
(List<? extends Comparable<? super T>> list,T key):
使用二分搜索法搜索指定列表,以获得指定对象 - 集合的元素自身要有比较性且集合必须要是有序的
- 如果找到了就返回元素的索引,如果没找到就返回负数
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
System.out.println("排序前:");
for (Integer num : list) {
System.out.println(num);
}
System.out.println("查找结果:");
int index = Collections.binarySearch(list, 10);
System.out.println(index);
}
}
***执行结果:***
排序前:
1
10
3
5
9
2
查找结果:
-7
- 可以发现查找结果返回的是负数,说明没有排序无法查找
- 解决方案:在二分查找前先对集合进行排序
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
System.out.println("排序前:");
for (Integer num : list) {
System.out.println(num);
}
System.out.println("排序后:");
Collections.sort(list);
for (Integer num : list) {
System.out.println(num);
}
System.out.println("查找结果:");
int index = Collections.binarySearch(list, 10);
System.out.println(index);
}
}
***执行结果:***
排序前:
1
10
3
5
9
2
排序后:
1
2
3
5
9
10
查找结果:
5
- 自定义类对象
//Person.java
package com.collections.demo2;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.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 String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person p) {
int num1 = this.age - p.getAge();
int num2 = num1==0 ? this.name.compareTo(p.getName()) : num1;
return num2;
}
}
//CollectionsTest2.java
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.collections.demo.Person;
public class CollectionsTest2 {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
Person p1 = new Person("张三", 18);
Person p2 = new Person("李四", 16);
Person p3 = new Person("王五", 19);
Person p4 = new Person("赵六", 15);
Person p5 = new Person("马七", 17);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前:");
for (Person person : list) {
System.out.println(person);
}
System.out.println("排序后:");
Collections.sort(list);
for (Person person : list) {
System.out.println(person);
}
System.out.println("查找结果:");
int index = Collections.binarySearch(list, new Person("马七", 17));
System.out.println(index);
}
}
***执行结果:***
排序前:
Person [name=张三, age=18]
Person [name=李四, age=16]
Person [name=王五, age=19]
Person [name=赵六, age=15]
Person [name=马七, age=17]
排序后:
Person [name=赵六, age=15]
Person [name=李四, age=16]
Person [name=马七, age=17]
Person [name=张三, age=18]
Person [name=王五, age=19]
查找结果:
2
六、求集合最大值
- public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll):
根据元素的自然顺序,返回给定 collection 的最大元素
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest3 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
Integer max = Collections.max(list);
System.out.println(max);
}
}
***执行结果:***
2
- max方法不需要排序即可使用
- 查看其源码可以发现max方法底层是基于compareTo方法进行比较的
七、将集合逆置
- public static void reverse(List<?> list):反转指定列表中元素的顺序
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest4 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
System.out.println("逆置前:");
for (Integer num : list) {
System.out.println(num);
}
System.out.println("逆置后:");
Collections.reverse(list);
for (Integer num : list) {
System.out.println(num);
}
}
}
逆置前:
1
10
3
5
9
2
逆置后:
2
9
5
3
10
1
八、将集合随机置换(打乱顺序)
- public static void shuffle(List<?> list):使用默认随机源对列表进行置换
package com.collections.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsTest5 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(3);
list.add(5);
list.add(9);
list.add(2);
System.out.println("打乱顺序前:");
for (Integer num : list) {
System.out.println(num);
}
System.out.println("打乱顺序后:");
Collections.shuffle(list);
for (Integer num : list) {
System.out.println(num);
}
}
}
- 打乱顺序后的排列是随机的,每次执行都会有不同的顺序
打乱顺序前:
1
10
3
5
9
2
打乱顺序后:
5
10
9
3
1
2