【Java基础】Collections集合概述和使用、ArrayList集合存储学生并排序及斗地主案例

简介: 【Java基础】Collections集合概述和使用、ArrayList集合存储学生并排序及斗地主案例

一、Collections概述和使用

Collection类的作用:是针对集合操作的工具类


Collection类常用方法:

方法名 说明
public static void sort(List list) 将指定的列表按升序排序
public static void reverse(List<?> list) 反转指定列表中元素的顺序
public static void shuffle(List<?> list) 使用默认的随机 

示例代码:

public class CollectionsDemo01 { 
    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); 
        //public static <T extends Comparable<? super T>> void sort•(List<T> list):将指定的列表按升序排序
         Collections.sort(list); 
        //public static void reverse•(List<?> list):反转指定列表中元素的顺序 
         Collections.reverse(list); 
        //public static void shuffle•(List<?> list):使用默认的随机源随机排列指定的列表 
        Collections.shuffle(list); 
        System.out.println(list); 
    } 
}

二、ArrayList集合存储学生并排序

需求:


ArrayList存储学生对象,使用Collections对ArrayList进行排序


代码实现:


学生类

public class Student { 
    private String name; 
    private int age; 
    public Student() { 
    }
    public Student(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; 
    } 
}

测试类:

public class CollectionsDemo02 { 
    public static void main(String[] args) { 
        //创建ArrayList集合对象 
        ArrayList<Student> array = new ArrayList<Student>(); 
        //创建学生对象 
        Student s1 = new Student("linqingxia", 30); 
        Student s2 = new Student("zhangmanyu", 35); 
        Student s3 = new Student("wangzuxian", 33); 
        Student s4 = new Student("liuyan", 33); 
        //把学生添加到集合 
        array.add(s1); 
        array.add(s2); 
        array.add(s3); 
        array.add(s4); 
        //使用Collections对ArrayList集合排序 
        //sort•(List<T> list, Comparator<? super T> c) 
        Collections.sort(array, 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; 
            } 
        }); 
        //遍历集合 
        for (Student s : array) { 
            System.out.println(s.getName() + "," + s.getAge()); 
        } 
    } 
}

三、斗地主案例

需求:


通过程序实现斗地主过程中的洗牌,发牌和看牌。要求:对牌进行排序


代码实现:

public class PokerDemo { 
    public static void main(String[] args) { 
        //创建HashMap,键是编号,值是牌 
        HashMap<Integer, String> hm = new HashMap<Integer, String>(); 
        //创建ArrayList,存储编号 
        ArrayList<Integer> array = new ArrayList<Integer>(); 
        //创建花色数组和点数数组 
        String[] colors = {"♦", "♣", "♥", "♠"}; 
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; 
        //从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号 
        int index = 0; 
        for (String number : numbers) { 
            for (String color : colors) { 
                hm.put(index, color + number); 
                array.add(index); 
                index++; 
            } 
        }
        hm.put(index, "小王"); 
        array.add(index); 
        index++; 
        hm.put(index, "大王"); 
        array.add(index); 
        //洗牌(洗的是编号),用Collections的shuffle()方法实现 
        Collections.shuffle(array); 
        //发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收) 
        TreeSet<Integer> lqxSet = new TreeSet<Integer>(); 
        TreeSet<Integer> lySet = new TreeSet<Integer>(); 
        TreeSet<Integer> fqySet = new TreeSet<Integer>(); 
        TreeSet<Integer> dpSet = new TreeSet<Integer>();
        for (int i = 0; i < array.size(); i++) { 
            int x = array.get(i); 
            if (i >= array.size() - 3) { 
                dpSet.add(x); 
            } else if (i % 3 == 0) { 
                lqxSet.add(x); 
            } else if (i % 3 == 1) { 
                lySet.add(x); 
            } else if (i % 3 == 2) { 
                fqySet.add(x); 
            } 
        }
        //调用看牌方法 
        lookPoker("林青霞", lqxSet, hm); 
        lookPoker("柳岩", lySet, hm); 
        lookPoker("风清扬", fqySet, hm); 
        lookPoker("底牌", dpSet, hm); 
    }
    //定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌) 
    public static void lookPoker(String name, TreeSet<Integer> ts,HashMap<Integer,String> hm) { 
        System.out.print(name + "的牌是:"); 
        for (Integer key : ts) { 
            String poker = hm.get(key); 
            System.out.print(poker + " "); 
        }
        System.out.println(); 
    } 
}
目录
相关文章
|
10天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
10天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
11 0
|
6月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
23天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
52 5
|
3月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List