在前一篇文章中,我们学习了两个单独收集的接口及其常用的实现类别;在这些接口或实现类别中,我们提供了许多实用的方法。
本文介绍了java开发人员为我们提供工具类,让我们更好地使用集合
Collections 工具类介绍Collections 这是一个操作Set,List,集合工具类,如Map。它提供了一系列静态方法来排序、查询和修改集合元素,以及设置不可变的集合对象和同步控制集合对象。
常用功能通过java的api文档,我们可以看到collections有很多方法。在这里,我们将选择一些常用的功能来展示它们的使用:
- public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
- public static <T> void sort(List<T> list):根据元素的自然顺序 按升序排序指定列表
- public static <T> void sort(List<T> list,Comparator<? super T> ): 指定列表按指定比较器生成的顺序进行排序。
直接滚代码:
import java.util.ArrayList;import java.util.Collections;import java.util.List;class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}public class Demo1Collections { public static void main(String[] args) { ///创建Listt 集合 List<Integer> numbers = new ArrayList<>(); ///在这里,我们顺便使用Collectionsadall()方法 Collections.addAll(numbers, 3,34,345,66,22,1); System.out.println("原集合" + numbers); //使用排序算法 Collections.sort(numbers); System.out.println("排序之后"+numbers); Collections.shuffle(numbers); System.out.println("乱序之后" + numbers); ///创建一个字符串Listt 集合 List<String> stringDemo = new ArrayList<>(); stringDemo.add("nihao"); stringDemo.add("hello"); stringDemo.add("wolrd"); stringDemo.add("all"); System.out.println("原集合" + stringDemo); //使用排序算法 Collections.sort(stringDemo); System.out.println("排序之后"+stringDemo); List<Person> people = new ArrayList<>(); people.add(new Person("秋香", 15)); people.add(new Person("石榴姐", 19)); people.add(new Person("唐伯虎", 12)); System.out.println("--" + people); //如果Person类,这里报错了,为什么? 在这里埋伏笔,看下面 Collections.sort(people); System.out.println("----" + people); }}
Comparable 和 ComparatorComparable 接口实现集合排序以上代码的最后一个例子使用了我们自定义的类型,并在使用排名时向我们报告了错误?为什么是这样?整个包装类型和字符串类型与我们的自定义类型有什么区别?然后我们可以通过API文档看到这个方法 根据元素的自然顺序 按升序对指定列表进行排序。必须实现列表中的所有元素 Comparable 界面。此外,列表中的所有元素都必须相互比较。 Comparable 接口只有一种方法 int compareTo(T o)比较此对象和指定对象的顺序。
编程学习,从云源开始,课程视频,在线书籍,在线编程,一对一咨询...你想要的所有学习资源都在这里,重点是免费!点击此处查看
说白话,当我们使用自定义类型进行集合排序时,我们需要实现这个Comparable接口并重写 compareTo(T o)。
public class Person2 implements Comparable<Person2>{ private String name; private int age; public Person2(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person2{" + "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(Person2 o) { ///如何写重写方法?// return 0; ////默认元素是一样的 //自定义规则 我们通过person通过person 比较年龄 this 代表本身,而 o 代表传参的person对象 //这里的比较规则 // ==》 升序 自己 - 别人 // ==》 降序 别人 - 自己// return this.getAge() - o.getAge(); //升 return o.getAge() - this.getAge(); //降 }}public class Demo2Comparable { public static void main(String[] args) { List<Person2> people2 = new ArrayList<>(); people2.add(new Person2("秋香", 15)); people2.add(new Person2("石榴姐", 19)); people2.add(new Person2("唐伯虎", 12)); System.out.println("--" + people2); ///这里报错了,为什么? Collections.sort(people2); System.out.println("----" + people2); }}
Comparator 实现排序使用Comparable 接口排序是一种僵化的方式。我们必须让自定义类每次都实现这个接口。如果我们的自定义类只是偶尔的话二会做排序,这种实现方式,不是很麻烦!所以工具类也为我们提供了一种灵活的排序方法,当我需要做排序时,选择调用这种方法来实现它
public static <T> void sort(List<T> list, Comparator<? super T> c)
根据指定比较器生成的顺序对指定列表进行排序。让我们通过案例来看看这种方法的使用
public class Person { private String name; private int age; public Person(String name, int age) { 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 + '}'; }}public class Demo3Comparator { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("秋香", 15)); people.add(new Person("石榴姐", 19)); people.add(new Person("唐伯虎", 12)); System.out.println("--" + people); //第二个参数 匿名内部类以匿名内部类的方式传参 - 可以复习以前使用的内部类别 Collections.sort(people, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { ///这里怎么用? 根据年龄定制//// return 0;// return o1.getAge() - o2.getAge(); //升序 return o2.getAge() - o1.getAge(); //降序 //结论: 前者 -后者 升序 反之,降序 //这样 我们优先使用 } }); System.out.println("排序后----" + people); }}
Comparable 和 ComparatorComparable: 强行对实现其各类的对象进行整体排序。这种排序称为类的自然排序,类的compareto方法称为自然比较方法。compareto()只能在类中实现一次,不能经常修改类代码来实现他们想要的排名。通过Collections实现此接口的对象列表(和数组).sort(和Arrays.sort)自动排序,对象可用作有序映射中的键或有序集中元素,无需指定比较器。<br>Comparator: 强行对某个对象进行整体排序。Comparator 传递给sort方法(如collectionsons).sort或 Arrays.sort),从而允许精确控制排序顺序。Comparator也可以用来控制某些数据结构(如有序set或有序映射)的顺序,或者为没有自然顺序的对象colection提供排序。
小结Collections 是 Java 用于操作集合的工具类,它提供了一系列静态方法来对集合进行排序、搜索、遍历等操作。在 Java 中,Map 用于存储键值对数据的特殊集合。虽然 Collections 类的一些方法可以直接操作 Map 键或值的集合视图,但不能直接对整个视图 Map 进行操作。
Collections 该类提供了一些静态方法 Map 按键或值集合视图进行操作,如排序、搜索最大值、搜索最小值等。例如,Collections.sort 方法可以对 List 类型的集合被排序,而 List 类型的 map.keySet() 和 map.values() 这种方法可以用来排序返回的集合。同样地,Collections.max 和 Collections.min 也可用于获得集合中的最大值和最小值。<br>另外,对于整个 Map 可直接使用的操作 Map 操作接口提供的方法,如 put、get、remove 等。假如需要对整个 Map 操作一般直接调用 Map 界面提供的方法将更加方便和直观。
总之,Collections 类别主要用于操作集合类(如 List、Set),而对于 Map 一般直接使用类型操作 Map 接口提供的方法。<br>还是老生常谈,熟能生巧!多练习!happy ending!!