Java_集合11_Collections集合工具类

Collections(理解)    

1.    Collections:是针对集合进行操作的工具类,都是静态方法

2.    面试题:Collection和Collections的区别

        A:Collection 是单列集合的顶层接口,有两个子接口List和Set

        B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等

3.    常见的几个小方法:

A:     public static <T extends Comparable<? super T>> void sort(List<T> list):根据元素的自然顺序 对指定列表按升序进行排序。

public static <T> void sort(List<T> list, Comparator<? super T> c):根据指定比较器产生的顺序对指定列表进行排序。

B:     public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key):使用二分搜索法搜索指定列表,以获得指定对象。

C:     public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll):根据元素的自然顺序,返回给定 collection 的最大元素。

D:     public static void reverse(List<?> list):反转指定列表中元素的顺序。

E:     public static void shuffle(List<?> list):使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。

 

public class CollectionsDemo {

    public static void main(String[] args) {

        // 创建集合对象

        ArrayList<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);// list:[30, 20, 50, 10, 40]

 

        // public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。

        // Collections.sort(list);

        // System.out.println("list:" + list);// list:[10, 20, 30, 40, 50]

 

        // public static <T> int binarySearch(List<?> list,T key):二分查找

        System.out.println("binarySearch:" + Collections.binarySearch(list, 30));// binarySearch:0

        System.out.println("binarySearch:" + Collections.binarySearch(list, 300));// binarySearch:-6

        System.out.println("binarySearch:" + Collections.binarySearch(list, 3));// binarySearch:-1

 

        // public static <T> T max(Collection<?> coll):最大值

        System.out.println("max:"+Collections.max(list));// max:50

 

        // public static void reverse(List<?> list):反转

        // Collections.reverse(list);

        // System.out.println("list:" + list);// list:[40, 10, 50, 20, 30]

 

        // public static void shuffle(List<?> list):随机置换

        // Collections.shuffle(list);

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

    }

}

 

4.    案例

        A:ArrayList集合存储自定义对象的排序

        B:模拟斗地主洗牌和发牌

        C:模拟斗地主洗牌和发牌并对牌进行排序

/*******************************************************************************************************************************/

/*

* Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢?

*/

public class CollectionsDemo {

    public static void main(String[] args) {

        // 创建集合对象

        List<Student> list = new ArrayList<Student>();

 

        // 创建学生对象

        Student s1 = new Student("林青霞", 27);

        Student s2 = new Student("风清扬", 30);

        Student s3 = new Student("刘晓曲", 28);

        Student s4 = new Student("武鑫", 29);

        Student s5 = new Student("林青霞", 27);

 

        // 添加元素对象

        list.add(s1);

        list.add(s2);

        list.add(s3);

        list.add(s4);

        list.add(s5);

 

        // 排序

        // 自然排序

        // Collections.sort(list);

        // 比较器排序

        // 如果同时有自然排序和比较器排序,以比较器排序为主

        Collections.sort(list, new Comparator<Student>() {

            @Override

            public int compare(Student s1, Student s2) {

                int num = s2.getAge() - s1.getAge();

                int num2 = num == 0 ? s1.getName().compareTo(s2.getName())

                        : num;

                return num2;

            }

        });

 

        // 遍历集合

        for (Student s : list) {

            System.out.println(s.getName() + "---" + s.getAge());

        }

    }

}

public class Student implements Comparable<Student> {

    private String name;

    private int age;

    public Student() {}

    public Student(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    //getXxx()/setXxx()...

    

    public int compareTo(Student s) {

        int num = this.age - s.age;

        int num2 = num == 0 ? this.name.compareTo(s.name) : num;

        return num2;

    }

}

/*******************************************************************************************************************************/

/*

* 模拟斗地主洗牌和发牌

*

* 分析:

*         A:创建一个牌盒

*         B:装牌

*         C:洗牌

*         D:发牌

*         E:看牌

*/

public class PokerDemo {

    public static void main(String[] args) {

        // 创建一个牌盒

        ArrayList<String> arrayList = new ArrayList<String>();

 

        // 装牌

        // 黑桃A,黑桃2,黑桃3,...黑桃K

        // 红桃A,...

        // 梅花A,...

        // 方块A,...

        // 定义一个花色数组

        String[] colors = { "♠", "♥", "♣", "♦" };

        // 定义一个点数数组

        String[] numbers = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };

        // 装牌

        for (String color : colors) {

            for (String number : numbers) {

                arrayList.add(color.concat(number));// 将指定字符串连接到此字符串的结尾。 "cares".concat("s") returns "caress"

            }

        }

        arrayList.add("小王");

        arrayList.add("大王");

 

        // 洗牌

        Collections.shuffle(arrayList);

 

        // System.out.println("arrayList:" + arrayList);

 

        // 发牌

        ArrayList<String> liuDeHua = new ArrayList<String>();

        ArrayList<String> linQingXia = new ArrayList<String>();

        ArrayList<String> liuYi = new ArrayList<String>();

        ArrayList<String> diPai = new ArrayList<String>();

 

        for (int x = 0; x < arrayList.size(); x++) {

            if (x >= arrayList.size() - 3) {

                diPai.add(arrayList.get(x));

            } else if (x % 3 == 0) {

                liuDeHua.add(arrayList.get(x));

            } else if (x % 3 == 1) {

                linQingXia.add(arrayList.get(x));

            } else if (x % 3 == 2) {

                liuYi.add(arrayList.get(x));

            }

        }

 

        // 看牌

        lookPoker("刘德华", liuDeHua);

        lookPoker("林青霞", linQingXia);

        lookPoker("刘意", liuYi);

 

        lookPoker("底牌", diPai);

    }

 

    public static void lookPoker(String name, ArrayList<String> array) {

        System.out.print(name + "的牌是:");

        for (String s : array) {

            System.out.print(s + " ");

        }

        System.out.println();

    }

}

/*******************************************************************************************************************************/

/*

* 思路:

*         A:创建一个HashMap集合

*         B:创建一个ArrayList集合

*         C:创建花色数组和点数数组

*         D:0开始往HashMap里面存储编号,并存储对应的牌

* 同时往ArrayList里面存储编号即可。

* E:洗牌(洗的是编号)

* F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

* G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

*/

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) {

                String poker = color.concat(number);

                hm.put(index, poker);

                array.add(index);

                index++;

            }

        }

        hm.put(index, "小王");

        array.add(index);

        index++;

        hm.put(index, "大王");

        array.add(index);

 

        // 洗牌(洗的是编号)

        Collections.shuffle(array);

 

        // 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

        TreeSet<Integer> fengQingYang = new TreeSet<Integer>();

        TreeSet<Integer> linQingXia = new TreeSet<Integer>();

        TreeSet<Integer> liuYi = new TreeSet<Integer>();

        TreeSet<Integer> diPai = new TreeSet<Integer>();

 

        for (int x = 0; x < array.size(); x++) {

            if (x >= array.size() - 3) {

                diPai.add(array.get(x));

            } else if (x % 3 == 0) {

                fengQingYang.add(array.get(x));

            } else if (x % 3 == 1) {

                linQingXia.add(array.get(x));

            } else if (x % 3 == 2) {

                liuYi.add(array.get(x));

            }

        }

 

        // 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

        lookPoker("风清扬", fengQingYang, hm);

        lookPoker("林青霞", linQingXia, hm);

        lookPoker("刘意", liuYi, hm);

        lookPoker("底牌", diPai, hm);

    }

 

    // 写看牌的功能

    public static void lookPoker(String name, TreeSet<Integer> ts,

            HashMap<Integer, String> hm) {

        System.out.print(name + "的牌是:");

        for (Integer key : ts) {

            String value = hm.get(key);

            System.out.print(value + " ");

        }

        System.out.println();

    }

}

/*******************************************************************************************************************************/

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/zhaolanqi/p/9263788.html