Collections的用法

java.util.Collections类,Collection 集合工具类,提供大量静态方法简化集合操作

一、常用方法

1、public static boolean addAll(Collection<? super T> c, T… elements)

将所有指定元素添加到指定 Collection 中,分别指定要添加的元素,或者将它们指定为一个数组

        ArrayList<Integer> list = new ArrayList<>();
		// Cannot resolve method 'addAll(ArrayList<Integer>, int[])'
		// int[] arr = {10, 20, 30};  // int类型 
        Integer[] arr = {10, 20, 30}; // Integer类型,集合元素类型只能是引用类型
        Collections.addAll(list, arr);
        Collections.addAll(list, 40, 50, 60);
        System.out.println(list); // [10, 20, 30, 40, 50, 60]

2、public static void shuffle(List<?> list) 打乱元素顺序,只针对 List 集合

 		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Collections.shuffle(list);
        System.out.println(list); // [4, 2, 5, 1, 3] 每次运行结果随机

3、public static void rotate(List<?> list, int distance) 根据指定的距离轮换指定列表中的元素

当方法的参数 distance 取正值时,向右移动 list 中的数据;取负值时,向左移动 list 中的数据

对于 0 和 list.size()-1 之间的所有 i 值,索引 i 处的元素将是以前位于索引 (i - distance) mod list.size() 处的元素

  		List<Integer> linkedList = new LinkedList<>();
        for (int i = 1; i <= 5; i++) {
            linkedList.add(i);
        }
        System.out.println("旋转前,链表中的数据");
        Iterator<Integer> it = linkedList.iterator();
        while (it.hasNext()) {
            System.out.printf("%d\t", it.next()); // 1	2	3	4	5
        }

        Collections.rotate(linkedList, 1);
        System.out.println("\n旋转后,链表中的数据");
        it = linkedList.iterator(); // 必须重新获取迭代器
        while (it.hasNext()) {
            System.out.printf("%d\t", it.next()); // 5	1	2	3	4	
        }

在这里插入图片描述
4、public static void reverse(List<?> list) 反转元素顺序,只针对 List 集合

 		List<Integer> list = Arrays.asList(1, 2, 59, 12, 87);
        Collections.reverse(list);
        System.out.println(list); // [87, 12, 59, 2, 1]

5、public static Comparator reverseOrder()

返回一个比较器,以逆自然顺序对实现 Comparable 接口的对象数组或集合进行排序

		// 数组,逆自然顺序
        String[] strs = {"c++", "java", "php"};
        Arrays.sort(strs, Collections.reverseOrder()); // 降序
        System.out.println(Arrays.toString(strs));     // [php, java, c++]

		// 集合,逆自然顺序
        List<String> strs = Arrays.asList("c++", "java", "php");
        Collections.sort(strs, Collections.reverseOrder()); // 降序
        System.out.println(strs);                           // [php, java, c++]

二、练习题

1、斗地主,最后发到玩家手中的牌是无序的

public class DemoDDZ {
    public static void main(String[] args) {

        // 创建一个ArrayList存储扑克牌
        ArrayList<String> poker = new ArrayList<>();

        /**
         * 1、备牌 普通牌:13*4、特殊牌:大王、小王
         */
        // 普通牌:两个数组,嵌套循环,匹配扑克
        String[] numbers = 
        {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"}; // 数值
        String[] colors = {"♤", "♥", "♣", "♦"};                             // 花色
        for (String color : colors) {
            for (String number : numbers) {
                poker.add(color + number); // 形式:花色+数值
            }
        }
        // 特殊牌:最后放入大王、小王
        poker.add("大王");
        poker.add("小王");
        // System.out.println("备牌:" + poker);

        /**
         * 2、洗牌 Collections静态方法shuffle,只针对List集合
         */
        Collections.shuffle(poker);
        // System.out.println("洗牌:" + poker);

        /**
         * 3、分牌 四个集合分别存放三位玩家的牌和底牌
         * 如何给三位玩家分牌 取模运算(余数)
         * 对2取模可区分两种情况0,1、对3取模可区分三种情况0,1,2
         * 前面的牌轮流分给三位玩家,最后三张牌做底牌(共54张,索引≥51)
         */
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        for (int i = 0; i < poker.size(); i++) {
            if (i >= 51) { // 先把底牌分了,不然分着分着就没底牌啦
                dipai.add(poker.get(i));
            } else if (i % 3 == 0) {
                player1.add(poker.get(i));
            } else if (i % 3 == 1) {
                player2.add(poker.get(i));
            } else if (i % 3 == 2) {
                player3.add(poker.get(i));
            }
        }

        /**
         * 4、看牌
         */
        System.out.println("玩家1:" + player1);
        System.out.println("玩家2:" + player2);
        System.out.println("玩家3:" + player3);
        System.out.println("底牌:" + dipai);
    }
}

在这里插入图片描述
2、斗地主,最后发到玩家手中的牌是有序的

public class DemoDDZ {
    public static void main(String[] args) {
        /*第一步:准备牌*/
        //创建map集合用来存储组装好的牌及其索引       
        HashMap<Integer, String> poker = new HashMap<>();
        
        //创建ArrayList集合存放map集合中各张牌的索引      
        ArrayList<Integer> pokerIndex = new ArrayList<>(); 
        //创建两个集合,分别存储数字和花色      
        ArrayList<String> colors = new ArrayList<>();
        Collections.addAll(colors, "♣", "♦", "♠", "♥");
        ArrayList<String> numbers = new ArrayList<>();
        Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
        //先将大王,小王放进去    
        int index = 0;
        poker.put(index, "大王");
        pokerIndex.add(index);
        index++;
        poker.put(index, "小王");
        pokerIndex.add(index);
        index++;
        //嵌套循环两个集合,组装花色和数字     
        for (String number : numbers) {
            for (String color : colors) {
                poker.put(index, color + number);//放入4*13张普通牌:2,A...3 
                pokerIndex.add(index);
                index++;
            }
        }
        
        /*第二步:洗牌*/
        //Collections类中的shuffle方法,只针对List集合
        Collections.shuffle(pokerIndex);
        
        /*第三步:发牌 三位玩家+底牌*/
        ArrayList<Integer> player01 = new ArrayList<>();
        ArrayList<Integer> player02 = new ArrayList<>();
        ArrayList<Integer> player03 = new ArrayList<>();
        ArrayList<Integer> dipai = new ArrayList<>();
        for (int i = 0; i < pokerIndex.size(); i++) {
            if (i >= 51) {
                dipai.add(pokerIndex.get(i));
            } else if (i % 3 == 0) {
                player01.add(pokerIndex.get(i));
            } else if (i % 3 == 1) {
                player02.add(pokerIndex.get(i));
            } else if (i % 3 == 2) {
                player03.add(pokerIndex.get(i));
            }
        }
        
        /*第四步:排序*/
        Collections.sort(player01);
        Collections.sort(player02);
        Collections.sort(player03);
        Collections.sort(dipai);
        
        /*第五步:看牌 根据玩家手中的索引,对应到map集合的value*/
        method("玩家1:", poker, player01);
        method("玩家2:", poker, player02);
        method("玩家3:", poker, player03);
        method("底牌:", poker, dipai);
    }

    public static void method(String name, HashMap<Integer, String> hashMap, ArrayList<Integer> arrayList) {
        System.out.print(name);
        for (int i = 0; i < arrayList.size(); i++) {
            String value = hashMap.get(arrayList.get(i));
            System.out.print(value + " ");
        }
        System.out.println();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鱼悠奕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值