Java集合框架——Collections 类

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

猜你喜欢

转载自blog.csdn.net/weixin_43796325/article/details/104461345