Java 常用工具-集合

1.集合简介

什么是集合?

简称集,是用来存储多个元素的容器

集合和数组的区别

1.元素类型

集合:引用类型(存储基本类型是自动装箱)

数组:基本类型,引用类型

2.元素个数

集合:不固定,可以任意扩容

数组:固定,不能改变容量

集合的好处

不受容器大小限制,可以随时添加、删除元素,提供大量操作元素的方法(判断、获取)

Java的集合体系

1.单列集合(Collection)

List:ArrayList

Set:HashSet

2.双列集合(Map:key,value)

Map:HashMap

2.List集合的特点和应用

List集合的特点

可重复、有序(存取顺序相同)

应用:

List list = new ArrayList();

案例:List集合的简单使用

需求:向List集合中添加三个元素,并遍历打印

分析:

A:向集合中添加元素的方法:add()

B:遍历集合的反思:for循环

C:获取集合中的元素个数的方法:size()

步骤:

1.创建集合对象:

List list = new ArrayList();

2.分别创建三个Student对象

3.使用add方法将Student对象添加到集合中

4.使用for循环遍历集合并打印

//定义一个学生类
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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
//测试类

import java.util.ArrayList;
import java.util.List;

/**
 *案例:List集合的简单使用
 * 需求:向List集合中添加三个元素,并遍历打印
 *
 * 分析:
 * A:向集合中添加元素的方法:add()
 * B:遍历集合的反思:for循环
 * C:获取集合中的元素个数的方法:size()
 *
 * 步骤:
 * 1.创建集合对象:
 * List list = new ArrayList();
 * 2.分别创建三个Student对象
 * 3.使用add方法将Student对象添加到集合中
 * 4.使用for循环遍历集合并打印
 *
 * 使用集合的步骤:
 * 1.创建集合对象
 * 2.创建元素对象
 * 3.将元素对象添加到集合中
 * 4.遍历集合
 *
 */
public class Test {
    public static void main(String[] args) {

        //1.创建集合对象
        List list = new ArrayList();

        //2.创建三个元素对象
        Student s1 = new Student("张三",12);
        Student s2 = new Student("李四",15);
        Student s3 = new Student("王二",13);

        //3.将元素添加到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);

        //打印list
        System.out.println(list);
        System.out.println("-----------");
        //获取索引为2的元素
        Object obj = list.get(2);
        System.out.println(obj);
        System.out.println("----------");
        //获取集合元素的个数
        int size = list.size();
        System.out.println("集合的长度:"+size);

        System.out.println("----------");
        //遍历集合
        for (int i = 0; i <list.size() ; i++) {
            //获取元素
            Object obj2 =list.get(i);
            System.out.println("索引为"+i+"的元素:"+obj2);
        }



    }
}

 

运行结果

 

 

3.增强for循环和迭代器

为什么需要增强for循环

简化数组和集合的遍历

增强for循环的格式

for(数据类型 变量名:数组或者集合对象){

//循环体,变量即元素

}

例子:

 

import java.util.ArrayList;
import java.util.List;

//测试类
//案例:演示增强for循环
//快捷方式:iter+回车 生成增强for的格式

/**
 * 注意:
 * 增强for的底层依赖的是迭代器(Iterator)
 * 增强for就是迭代器的简写
 */
public class Test {
    public static void main(String[] args) {
        //需求:通过增强for遍历集合List
        //1.创建集合对象
        List list = new ArrayList();

        //2.创建元素对象
        //3.将元素对象添加到集合中

        list.add(10);
        list.add(20);
        list.add(30);
        list.add(40);

        //4.遍历元素对象
        for (Object obj : list){
            //obj是集合中的元素,其本身是Integer类型的数据
            Integer i1 = (Integer) obj;
            System.out.println(i1);
        }

        for (Object o : list) {
            System.out.println(o);
        }
    }
}

 

运行结果:

 

 

为什么需要迭代器?

对过程的重复,成为迭代

列表迭代器是遍历Collection集合的通用方式,可以在对集合遍历的同时进行添加、删除等操作

迭代器的常用方法

·next():返回迭代的下一个元素对象

·hasNext如果仍有元素可以迭代,则返回true

例子:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

//测试类
//测试列表迭代器
public class Test2 {
    public static void main(String[] args) {
        //需求:判断如果集合有字符串b,就在它后面添加新的字符串:java
        //1.创建集合对象
        List list = new ArrayList();

        //2.创建元素对象
        //3.向集合添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");

        //根据集合对象获取其对象的迭代器对象
        ListIterator it = list.listIterator();

        //2.判断迭代器中是否有元素
        while (it.hasNext()){//如果it中有元素就一种迭代
            //3.如果有就获取元素
            String s = (String)it.next();
            if("b".equals(s)){//这样写可以避免空指针异常
                //list.add("java");//必须用列表迭代器
                it.add("java");

            }
            System.out.println(s);

        }



    }
}

 

运行结果:

 

 

4.泛型简介

什么是泛型?

即泛指任意类型,又叫参数化类型

对具体类型的使用起到辅助作用,类似于方法的参数

集合类泛型的解释

表示该集合中存放指定类型的元素

泛型的好处

类型安全

避免了类型转换

5.Collections工具类

简介

针对于集合进行操作的工具类

成员方法

·sort(List<T>)

根据元素的自然顺序,将指定列表按升序排列

·max(Collection<T>)

返回集合的最大元素

·reverse(List<T>)

f反转List集合元素

·shuffle(List<T>)

使用默认的随机源随机置换指定的列表

例子:

 

//测试类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *成员方法
 * ·sort(List<T>)
 * 根据元素的自然顺序,将指定列表按升序排列
 * ·max(Collection<T>)
 * 返回集合的最大元素
 * ·reverse(List<T>)
 * f反转List集合元素
 * ·shuffle(List<T>)
 * 使用默认的随机源随机置换指定的列表
 *
 */
public class Test {
    public static void main(String[] args) {

        //1.创建集合
        List<Integer> list = new ArrayList<>();

        //2.向集合添加数据

        list.add(1);
        list.add(3);
        list.add(3);
        list.add(5);
        list.add(5);
        list.add(4);
        //3.打印集合
        System.out.println("没有操作之前list中的数据:"+list);
        System.out.println("--------------------");

        //获取集合中最大元素
        Integer max = Collections.max(list);
        System.out.println("集合中最大的元素:"+max);

        System.out.println("--------------------");
        //对集合进行升序排列
        Collections.sort(list);
        System.out.println("升序后的结果为:"+list);

        System.out.println("--------------------");
        //对集合进行反转
        Collections.reverse(list);
        System.out.println("集合进行反转的结果:"+list);

        //随机置换,相当于洗牌
        Collections.shuffle(list);
        System.out.println("随机洗牌后的结果:"+list);

    }
}

 

运行结果:

 

 

 

6.Set集合的特点

特点:

不可重复,无序

应用:

Set<T>set = new HashSet<>();

案例:Set集合的简单使用

需求:向Set集合中添加5个元素,并遍历打印

分析:

A.向集合中添加元素的方法:add()

B.遍历集合的方式:迭代器

步骤:

1.创建集合对象

Set<Student> set = new HashSet<>();

2.分别创建5个Student对象

3.使用add方法将Student对象添加到集合中

4.使用迭代器遍历集合并打印,注意添加顺序和打印顺序是否相同

 

import java.util.Objects;

//定义学生类
public class Student {

    //成员变量
    private String name;
    private int age;

    //构造方法

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    //成员方法

    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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
//测试类

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 *案例:Set集合的简单使用
 * 需求:向Set集合中添加5个元素,并遍历打印
 * 分析:
 * A.向集合中添加元素的方法:add()
 * B.遍历集合的方式:迭代器
 *
 * 步骤:
 * 1.创建集合对象
 * Set<Student> set = new HashSet<>();
 * 2.分别创建5个Student对象
 * 3.使用add方法将Student对象添加到集合中
 * 4.使用迭代器遍历集合并打印,注意添加顺序和打印顺序是否相同
 *
 */
public class Test {
    public static void main(String[] args) {
        //1.创建泛型集合
        Set<Student> set = new HashSet<>();
        //2.创建5个Student对象
        Student s1 = new Student("张三",12);
        Student s2 = new Student("李四",15);
        Student s3 = new Student("王二",13);
        Student s4 = new Student("张三",12);
        Student s5 = new Student("李四",15);

        //3.使用add方法将Student对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);

        //5.遍历并打印
        //1.打印
        System.out.println(set);
        System.out.println("----------");
        //2.通过迭代器遍历打印
        Iterator<Student> it = set.iterator();
        while (it.hasNext()){
            Student student = it.next();
            System.out.println(student);
        }

        System.out.println("----------");
        //3.通过增强for遍历打印
        for (Student student : set) {
            System.out.println(student);
        }



    }
}

 

运行结果:

 

 

7.Map集合的特点

特点:

双列集合,元素键对(Entry)构成

Key --Value

key不可重复,value可以重复

应用:

Map<T1,T2>map  = new HashMap<>();

案例:Map集合的简单使用

需求:向Map集合中添加三个元素,并遍历打印

分析:

A.向map集合中添加元素的方法为:put()

B:遍历集合的方式:

获取所有的Key:keySet()

遍历keySet,通过key获取value:get()

C.遍历keySet的方法:iterator()

步骤:

1.创建集合对象

Map<Integer,Student> map = new HashMap<>();

2.创建三个Student对象

3.使用put方法将Studdent对象添加到集合中

4.获取所有keym并使用迭代器遍历

 

import java.util.Objects;

//学生类
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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
//测试类

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 *案例:Map集合的简单使用
 * 需求:向Map集合中添加三个元素,并遍历打印
 * 分析:
 * A.向map集合中添加元素的方法为:put()
 * B:遍历集合的方式:
 * 获取所有的Key:keySet()
 * 遍历keySet,通过key获取value:get()
 * C.遍历keySet的方法:iterator()
 * 步骤:
 * 1.创建集合对象
 * Map<Integer,Student> map = new HashMap<>();
 *
 * 2.创建三个Student对象
 * 3.使用put方法将Studdent对象添加到集合中
 * 4.获取所有keym并使用迭代器遍历
 *
 *
 *
 */
public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        Map<Integer,Student> map = new HashMap<>();

        //2.创建三个Student对象
        Student s1 = new Student("张三",12);
        Student s2 = new Student("李四",12);
        Student s3 = new Student("王二",12);

        //3.使用put方法将Studdent对象添加到集合中
        map.put(1,s1);
        map.put(2,s2);
        map.put(3,s3);

        //根据key获取value
        Student stu = map.get(3);
        System.out.println(stu);

        System.out.println("--------------");
        //4.获取所有keym并使用迭代器遍历
        System.out.println(map);
        //4.1 获取所有key的集合
        Set<Integer> set = map.keySet();
        //4.2 遍历所有key,获取每一个键
        //获取迭代器
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()){

            //4.3 根据key获取value
            Integer i = it.next();
            Student s = map.get(i);
            System.out.println("key:"+i +"value:"+s);
        }


        System.out.println("--------------");
        //通过增强for实现
        for (Integer i : set) {
            Student s = map.get(i);
            System.out.println("key:"+i +"value:"+s);
        }





    }
}

 

运行结果:

 

 

 

8.案例:模拟斗地主发牌功能

需求:使用一个集合对象存储一副扑克牌,将所有扑克的顺序打乱,然后分发给使用集合便是的三个玩家和底牌,并答应玩家和地盘的集合内容

步骤:

1.买一副扑克牌

将花色和数字分别进行组合,生成所有的普通牌,生成的普通手动添加大、小王

2.洗牌

使用Collections工具类的shuffle()方法打乱牌的顺序

3.发牌

遍历牌堆,将每一张牌分发到三个玩家中

留三张底牌

4.看牌

分别打印每个玩家集合的内容

 

//测试类

import java.util.*;

/**
 *
 *8.案例:模拟斗地主发牌功能
 *
 * 需求:使用一个集合对象存储一副扑克牌,将所有扑克的顺序打乱,然后分发给使用集合便是的三个玩家和底牌,并答应玩家和地盘的集合内容
 *
 * 步骤:
 * 1.买一副扑克牌
 * 将花色和数字分别进行组合,生成所有的普通牌,生成的普通手动添加大、小王
 * 2.洗牌
 * 使用Collections工具类的shuffle()方法打乱牌的顺序
 * 3.发牌
 * 遍历牌堆,将每一张牌分发到三个玩家中
 * 留三张底牌
 * 4.看牌
 * 分别打印每个玩家集合的内容
 *
 */
public class Test {
    public static void main(String[] args) {
        //1.将花色和数字分别进行组合,生成所有的普通牌,生成的普通手动添加大、小王
        //1.1创建一个Map集合用来存储牌的编号和花色数字
        Map<Integer,String > pukers = new HashMap<>();
        //1.2创建一个List集合来存储牌的编号
        List<Integer> list = new ArrayList<>();

        //1.3生成普通牌
        //创建数字数组
        String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        //创建花色数组
        String[] colors = {"♦","♣","♠","♥"};
        //循环生成普通牌
        int n = 0;
        for (String num : nums) {
            for (String color : colors) {
                String puker = color + num;
                //System.out.println(puker);
                pukers.put(n,puker);
                list.add(n++);
            }

        }

        //1.4生成大王,小王
        //生成小王
        pukers.put(n,"小王");
        list.add(n++);
        //生成大王
        pukers.put(n,"大王");
        list.add(n);

        System.out.println("牌的编号:"+ list);
        System.out.println("完整一副牌:"+ pukers);

        System.out.println("-----------------------------");
        //2.使用Collections工具类的shuffle()方法打乱牌的顺序
        Collections.shuffle(list);
        System.out.println("乱序的编号:"+list);


        System.out.println("-----------------------------");
        //3.遍历牌堆,将每一张牌分发到三个玩家中,留三张底牌
        //3.1创建三个玩家和底牌的集合
        List<Integer> wan1 = new ArrayList<>();
        List<Integer> wan2 = new ArrayList<>();
        List<Integer> wan3 = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //3.2遍历牌堆
        for (int i = 0; i <list.size() ; i++) {
            Integer pukerNum = list.get(i);
            if(i>=list.size()-3){//判断是否是最后三张牌
                dipai.add(pukerNum);
            }else if(i%3 == 0){//发给玩家1
                wan1.add(pukerNum);
            }else if(i%3 == 1){//发给玩家2
                wan2.add(pukerNum);
            }else if(i%3 == 2){//发给玩家3
                wan3.add(pukerNum);
            }

        }


        //4.分别打印每个玩家和底牌集合的内容
        /*
        (System.out.println("wan1:"+wan1);
        System.out.println("wan2:"+wan2);
        System.out.println("wan3:"+wan3);
        System.out.println("dipai"+dipai);

         */
        System.out.println("玩家1:"+printPuker(wan1,pukers));
        System.out.println("玩家2:"+printPuker(wan2,pukers));
        System.out.println("玩家3:"+printPuker(wan3,pukers));
        System.out.println("底牌:"+printPuker(dipai,pukers));



    }

    //创建方法用来顺序查看玩家和底牌的牌
    public static String printPuker(List<Integer> list , Map<Integer,String> pukers){
        String str = "";
        //给list集合排序
        Collections.sort(list);
        //增强for的方式循环输出玩家的牌
        for (Integer integer : list) {
            str = str + pukers.get(integer)+"\t";
        }

        return str;
    }
}

 

运行结果:

 

posted @ 2019-09-05 19:50  tli迪蝎  阅读(287)  评论(0编辑  收藏  举报