Collections-集合工具类

概述

Set 接口有实现类TreeSet,Map 接口有实现类 TreeMap 实现集合的排序。

但 List 接口没有实现排序的类,所以提供类Collections:是针对集合操作的工具类,都是静态方法为 List 接口提供排序等一系列功能

常用方法

  • 排序
    • public static <T extends Comparable<? super T>> void sort(List<T> list) :默认是自然排序
    • public static <T> void sort(List<T> list, Comparator<? super T> c) : 比较器排序
  • 二分查找
    • public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) :默认是自然排序排序后二分法查找
    • public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) :比较器排序,排序后二分法查找。
  • 最大值
    • public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) :默认是自然排序排序后查找最大值
    • public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) :比较器排序,排序后查找最大值。
  • 反转
    • public static void reverse(List<?> list)
  • 随机置换
    • public static void shuffle(List<?> list)
    • public static void shuffle(List<?> list, Random rnd)

注:public static <T extends Comparable<? super T>> void sort(List<T> list) 表示该方法中传递的泛型参数必须实现了Comparable中的compareTo(T o)方法,否则进行不了sort排序

自然排序

public class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(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 int compareTo(Student s) {
        int num = this.name.compareTo(s.name);
        int num2 = num == 0 ? this.age - s.age : num;
        return num2;
    }
}

public class CollectionsDemo {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        list.add(new Student("lili",21));
        list.add(new Student("lili",21));
        list.add(new Student("lili",22));
        list.add(new Student("jack",23));
        list.add(new Student("alin",25));
        System.out.println(list);

        // 自然排序 先排序姓名,再排序年龄
        Collections.sort(list);
        System.out.println(list);

        // 比较器排序 先排序年龄,再排序姓名
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s1.getAge() - s2.getAge();
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
                return num2;
            }
        });
        System.out.println(list);
    }
}

输出:
[Student{name='lili', age=21}, Student{name='lili', age=21}, Student{name='lili', age=22}, Student{name='jack', age=23}, Student{name='alin', age=25}]
[Student{name='alin', age=25}, Student{name='jack', age=23}, Student{name='lili', age=21}, Student{name='lili', age=21}, Student{name='lili', age=22}]
[Student{name='lili', age=21}, Student{name='lili', age=21}, Student{name='lili', age=22}, Student{name='jack', age=23}, Student{name='alin', age=25}]

结果看出,自然排序会调用 Student 定义的排序规则;而如果sort第二个参数集合实现自己的排序规则(比较器排序),会优先使用比较器排序规则

其他方法

public class CollectionsDemo {
    public static void main(String[] args) {
        // 创建集合对象
        List<Integer> list = new ArrayList<Integer>();

        // 添加元素
        list.add(30);
        list.add(20);
        list.add(50);
        list.add(10);
        list.add(40);

        System.out.println("list:" + list);

        Collections.sort(list);
        System.out.println("list:" + list);

        // public static <T> int binarySearch(List<?> list,T key):二分查找
        System.out.println("binarySearch:" + Collections.binarySearch(list, 40));
        System.out.println("binarySearch:" + Collections.binarySearch(list, 100));

        // public static <T> T max(Collection<?> coll):最大值
        System.out.println("max:"+Collections.max(list));

        // public static void reverse(List<?> list):反转
        Collections.reverse(list);
        System.out.println("list:" + list);

        //public static void shuffle(List<?> list):随机置换
        Collections.shuffle(list);
        System.out.println("list:" + list);
    }
}

输出:
list:[30, 20, 50, 10, 40]
list:[10, 20, 30, 40, 50]
binarySearch:3
binarySearch:-6
max:50
list:[50, 40, 30, 20, 10]
list:[10, 20, 40, 50, 30]

注:调用二分查找方法binarySearch()前,需要先进行排序sort(),不然调用binarySearch()返回索引值不正确。

HashSet排序

对于列表,我们使用Collections.sort(List)方法。如果我们想要排序HashSet怎么办?

方案一:

将HashSet集合复制到List,然后对 List 进行排序。

Set<?> yourHashSet = new HashSet<>();
List<?> sortedList = new ArrayList<>(yourHashSet);
Collections.sort(sortedList);

方案二

将HashSet集合复制到TreeSet,您将获得一个有序集。

HashSet myHashSet = new HashSet();
myHashSet.add(1);
myHashSet.add(23);
myHashSet.add(45);
myHashSet.add(12);

TreeSet myTreeSet = new TreeSet(myHashSet);
/*TreeSet myTreeSet = new TreeSet();
myTreeSet.addAll(myHashSet);*/
System.out.println(myTreeSet); // Prints [1, 12, 23, 45]

注:有两种方法将HashSet赋值给TreeSet。

  1. 一种是:构造方法 TreeSet myTreeSet = new TreeSet(myHashSet);
  2. 另一种:addAll()方法,myTreeSet.addAll(myHashSet)。

引申

可以通过stream()流操作 list 集合。
Stream流 - 获取Stream和转换操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: commons-collections-3.2.2.jar是一个Java类库,它提供了许多用于处理集合对象的工具和数据结构。这个jar文件是Apache Commons项目的一部分,旨在提供一个通用而强大的集合工具包,以帮助开发者更轻松地处理集合数据。 commons-collections-3.2.2.jar中包含了许多常用的集合类,如List、Set、Map等,同时还提供了一些特殊的集合类,如袋子(Bag)、多键Map(MultiMap)等。这些集合类实现了许多常见的集合操作,如排序、过滤、转换等,使得开发者能够更方便地处理集合数据。 除了集合类外,commons-collections-3.2.2.jar还提供了一些其他的实用工具类,如迭代器(Iterator)、比较器(Comparator)等,帮助开发者更高效地操作集合对象。 commons-collections-3.2.2.jar的使用非常简单,只需将该jar文件添加到项目的classpath中即可。开发者可以通过导入相应的包名,使用其中的类和方法来操作集合对象。 总之,commons-collections-3.2.2.jar是一个功能丰富的Java类库,可以帮助开发者更轻松地处理集合对象。无论是对于初学者还是有经验的开发者来说,这个库都提供了许多便捷的方法和工具,使得集合操作更加简单高效。 ### 回答2: commons-collections-3.2.2.jar是一个Java类库,提供了一组有用的集合类和工具类,使得在开发过程中更方便地操作和处理集合对象。 commons-collections-3.2.2.jar包含了一些常用的集合类,例如List、Set、Map等,它们都实现了Java集合框架的接口,并提供了一些常用的操作方法,如添加、删除、查找等。这些集合类具有扩展性,可以根据需要自定义实现,也可以通过合适的适配器类将其转换为其他类型的集合。 除了基础的集合类之外,commons-collections-3.2.2.jar还提供了一些特殊用途的集合类和工具类。例如,有一个可以解决数组操作问题的类ArrayUtils,它提供了各种对数组进行操作的方法,如合并、比较、填充等。还有一个针对集合元素处理的工具类CollectionUtils,它提供了各种便利的方法,如过滤、转换、排序等。 commons-collections-3.2.2.jar对于Java开发者来说非常有用,可以帮助简化代码、提高开发效率。它提供了丰富的集合操作方法,可以快速完成一些常见的集合处理任务。通过使用这个库,开发者可以更加专注于业务逻辑的实现,而无需关心底层的集合操作细节。 总之,commons-collections-3.2.2.jar是一个功能强大的Java类库,提供了丰富的集合类和工具类,可以帮助开发者更轻松地操作和处理集合对象,提高开发效率。 ### 回答3: commons-collections-3.2.2.jar是一个Java库,用于提供一组常见的数据结构和算法。它是Apache Commons项目的一部分,由Apache Software Foundation提供和维护。 该库包含了许多功能强大且易于使用的集合类,如列表、队列、堆栈和映射等。这些集合类提供了许多有用的方法和工具,可以简化开发人员对集合数据的操作和管理。 此外,commons-collections-3.2.2.jar还提供了一些算法和工具类,如排序、查找、迭代和转换等。它们可以在处理集合数据时提供更高效和灵活的选择。 commons-collections-3.2.2.jar还具有高度可扩展性和灵活性。开发人员可以通过继承已有的集合类或实现相关接口来定制和扩展其功能。它还支持泛型和迭代器等先进的Java特性,使开发人员能够更好地利用现代Java开发的功能和优势。 总的来说,commons-collections-3.2.2.jar是一个强大而可靠的Java库,为开发人员提供了许多常用的数据结构和算法。它在提高开发效率和代码质量方面发挥了重要作用,并广泛应用于各种Java应用程序的开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值