Java中Collections常用的API

Collections

java.util.Collections:是集合工具类

作用:Collections不是集合,而是集合的工具类

方法名称说明
public static <T> boolean addAll(Collection<T> c, T...elements)批量添加元素
public static void shuffle(List<?> list)打乱List集合元素的顺序
public static <T> void sort(List<T> list)排序
public static <T> void sort(List<T> list, Comparator<T> c)根据指定的规则进行排序
public static <T> int binarySearch(List<T> list, T key)以二分查找法查找元素
public static <T> void copy(List<T> dest, List<T> src)拷贝集合中的元素
public static <T> int fill(List<T> list, T obj)使用指定的元素填充集合
public static <T> void max/min(Collection<T> coll)根据默认的自然排序获取最大/最小值
public static <T> void swap(List<?> list, int i, int j)交换集合中指定位置的元素

示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CollectionsDemo1 {
    public static void main(String[] args) {
        // 一、addAll 批量添加元素
        System.out.println("------------------addAll-------------------");
        // 1.创建集合对象
        ArrayList<String> list = new ArrayList<>();
        // 2. 批量添加元素
        Collections.addAll(list, "abc", "bcd", "qwer", "df", "asdf", "zxcv", "1234", "qwer");
        // 3. 打印集合
        System.out.println(list);  // [abc, bcd, qwer, df, asdf, zxcv, 1234, qwer]

        // 二、shuffle 打乱数据
        System.out.println("------------------shuffle-------------------");
        Collections.shuffle(list);
        System.out.println(list);  // [df, qwer, asdf, qwer, zxcv, 1234, bcd, abc]

        // 三、sort排序
        // 默认规则:需要重写Comparable接口compareTo方法,Integer已经实现,按照从小到大的顺序排列
        // 如果是自定义对象,需要自己指定规则
        System.out.println("-----------------sort--------------------");
        ArrayList<Integer> list2 = new ArrayList<>();
        Collections.addAll(list2, 10, 1, 2, 4, 8, 5, 9, 6, 7, 3);
        Collections.sort(list2);
        System.out.println(list2);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        // 四、sort自定义排序
        System.out.println("---------------自定义sort----------------------");
        Collections.sort(list2, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;  // 降序
            }
        });
        System.out.println(list2);  // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

        // 五、binarySearch(二分查找)
        // 需要元素有序
        System.out.println("------------------binarySearch-------------------");
        ArrayList<Integer> list3 = new ArrayList<>();
        Collections.addAll(list3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        System.out.println(Collections.binarySearch(list3, 9));  // 8
        System.out.println(Collections.binarySearch(list3, 1));  // 0
        System.out.println(Collections.binarySearch(list3, 20));  // -11

        //六、copy(拷贝)
        // 把list4中的元素拷贝到list5中
        // 会覆盖原来的元素
        // 注意点:如果list4的长度 > list4的长度,方法会报错
        System.out.println("-----------------copy--------------------");
        ArrayList<Integer> list4 = new ArrayList<>();
        ArrayList<Integer> list5 = new ArrayList<>();
        Collections.addAll(list4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Collections.addAll(list5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        Collections.copy(list5, list4);
        System.out.println(list4);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        System.out.println(list5);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]

        // 七、fill
        // 把集合中所有数据,都修改为指定数据
        System.out.println("------------------fill-------------------");
        ArrayList<Integer> list6 = new ArrayList<>();
        Collections.addAll(list6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Collections.fill(list6, 100);
        System.out.println(list6);  // [100, 100, 100, 100, 100, 100, 100, 100, 100, 100]

        // 八、max/min
        // 求最大值或者最小值
        System.out.println("-----------------max/min--------------------");
        ArrayList<Integer> list7 = new ArrayList<>();
        Collections.addAll(list7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        System.out.println(Collections.max(list7));  // 10
        System.out.println(Collections.min(list7));  // 1

        // 九、max/min指定规则
        // String中默认是按照字母的abcdefg顺序进行排列的
        // 现在要求最长的字符串
        // 默认的规则无法满足,可以自己指定规则
        // 求指定规则的最大值或者最小值
        System.out.println("------------------max/min指定规则-------------------");
        ArrayList<String> list8 = new ArrayList<>();
        Collections.addAll(list8, "a", "aa", "aaa", "aaaa");
        System.out.println(Collections.max(list8, new Comparator<String>() {  // aaaa
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        }));

        // 十、swap
        System.out.println("-----------------swap--------------------");
        ArrayList<Integer> list9 = new ArrayList<>();
        Collections.addAll(list9, 1, 2, 3);
        Collections.swap(list9, 0 , 2);
        System.out.println(list9);  // [3, 2, 1]
    }
}

练习一: 班级里面有N名学生,学生属性:姓名、年龄、性别。 实现随机点名器

package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test1 {
    public static void main(String[] args) {
        /*
        班级里面有N名学生,学生属性:姓名、年龄、性别
        实现随机点名器
         */

        // 1,定义集合
        ArrayList<String> list = new ArrayList<>();
        // 2. 添加数据
        Collections.addAll(list, "范闲", "范建", "范统","杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆", "袁明媛");
        // 3. 随机点名
        // 第一种方式:随机数
        Random r = new Random();
        int index = r.nextInt(list.size());
        String name = list.get(index);
        System.out.println(name);

        // 第二种方式:shuffle打乱集合里的数据
        Collections.shuffle(list);
        String name2 = list.get(0);
        System.out.println(name2);
    }
}

练习二: 班级里有N名学生。要求:70%的概率随机到男生,30%的概率随机到女生

package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test2 {
    public static void main(String[] args) {
        /*
        班级里有N名学生。
        要求:70%的概率随机到男生
             30%的概率随机到女生
         */

        // 1. 创建集合
        ArrayList<Integer> list = new ArrayList<>();
        // 2. 添加数据
        Collections.addAll(list, 1, 1, 1, 1, 1, 1, 1);  // 添加7个1
        Collections.addAll(list, 0, 0, 0);  // 添加3个0
        // 3. 打乱集合中的数据
        Collections.shuffle(list);
        // 4. 从list集合中随机抽取0或1
        Random r = new Random();
        int index = r.nextInt(list.size());
        int number = list.get(index);
        System.out.println(number);

        // 5. 创建两个集合分别存储男生和女生的名字
        ArrayList<String> boyList = new ArrayList<>();
        ArrayList<String> girlList = new ArrayList<>();
        Collections.addAll(boyList, "范闲", "范建", "范统","杜子腾", "宋合泛", "侯笼藤", "朱益群", "朱穆");
        Collections.addAll(girlList, "袁明媛", "杜琦燕", "李彩", "田甜");

        // 6. 判断此时是从boyList里面抽取还是从girlList里抽取
        if(number == 1) {
            // boyList
            int boyIndex = r.nextInt(boyList.size());
            String name = boyList.get(boyIndex);
            System.out.println(name);
        } else {
            // girlList
            int girlIndex = r.nextInt(girlList.size());
            String name = girlList.get(girlIndex);
            System.out.println(name);
        }


    }
}

练习三:班级里有N名学生。 要求:被点到的学生不会再被点到。但是如果班级中所有的学生都点完了,需要重新开始第二轮点名。

package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        /*
        班级里有N名学生。
        要求:被点到的学生不会再被点到。
        但是如果班级中所有的学生都点完了,需要重新开始第二轮点名
         */

        // 1. 定义集合
        ArrayList<String> list1 = new ArrayList<>();
        // 2. 添加数据
        Collections.addAll(list1, "范闲", "范建", "范统","杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆", "袁明媛");
        // 创建一个临时的集合,用来存储已经被点到学生的名字
        ArrayList<String> list2 = new ArrayList<>();

        // 外循环:表示轮数
        for (int i = 0; i < 10; i++) {
            System.out.println("-------------第" + (i + 1) + "轮点名开始了-------------");
            // 3. 获取集合的长度
            int count = list1.size();
            // 4. 随机点名
            Random r = new Random();
            for (int j = 0; j < count; j++) {  // 一轮点名
                // 内循环:每一轮中随机循环抽取的过程
                int index = r.nextInt(list1.size());
                String name = list1.remove(index);
                list2.add(name);
                System.out.println(name);
            }
            // 此时一轮点名结束,list1空了,list2包含10名学生的名字
            list1.addAll(list2);
            list2.clear();
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值