16 集合(上)

简介: 16 集合

数组的不足


初始化时必须指定长度,有可能不足,有可能浪费


List接口的实现类


  • ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
  • LinkedList采用链表存储方式。插入、删除元素时效率比较高


image.png


如何存储多条狗狗信息,获取狗狗总数,逐条打印出各条狗狗信息 ?

请输入一条狗的名字,no退出
aa
请输入一条狗的名字,no退出
bb
请输入一条狗的名字,no退出
cc
请输入一条狗的名字,no退出
dd
请输入一条狗的名字,no退出
no
aa
bb
cc
dd
no
退出了

通过List接口的实现类ArrayList实现该需求

Scanner scanner = new Scanner(System.in);
//    String[] arrays = new String[100000000];
        List<String> listDogs = new ArrayList<>();//创建List集合对象
        while (true)
        {
            System.out.println("请输入一条狗的名字,no退出");
            String dogName = scanner.next();
            listDogs.add(dogName);//向List中添加元素
            if(dogName.equals("no"))
            {
                break;
            }
        }
        //遍历数组
        //listDogs.size()获得集合当前元素的个数
        for(int i = 0; i < listDogs.size(); i++)
        {
            System.out.println(listDogs.get(i));//listDogs.get(i)获得集合中第i个元素的值
        }
        System.out.println("退出了");

扩充以下几部分功能

删除指定位置的狗狗,如第一个狗狗

删除指定的狗狗,如删除feifeiDog对象

判断集合中是否包含指定狗狗


image.png

使用List接口提供的remove()、contains()方法

Scanner scanner = new Scanner(System.in);
//    String[] arrays = new String[100000000];
        List<String> listDogs = new ArrayList<>();//创建List集合对象
        while (true)
        {
            System.out.println("请输入一条狗的名字,no退出");
            String dogName = scanner.next();
            if(dogName.equals("no"))
            {
                break;
            }
            //判断集合中是否有名字是dogName的狗狗了,如果没有才加,有的话不加
            if(!listDogs.contains(dogName))
            {
                listDogs.add(dogName);//向List中添加元素
            }
        }
        //删除2条狗
        //1.根据位置删除remove
//        listDogs.remove(1);
        //2.根据对象删除remove
        listDogs.remove("abc");
        //遍历数组
        //listDogs.size()获得集合当前元素的个数
        for(int i = 0; i < listDogs.size(); i++)
        {
            System.out.println(listDogs.get(i));//listDogs.get(i)获得集合中第i个元素的值
        }
        System.out.println("退出了");


image.png


List中存放Dog对象

public class Dog {
    private String name;
    private int 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 static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Dog> dogList = new ArrayList<Dog>();
        while(true)
        {
            System.out.println("请输入一条狗的名字,no退出");
            String dogName = scanner.next();
            if(dogName.equals("no"))
            {
                break;
            }
            Dog dog = new Dog();
            dog.setName(dogName);
            dogList.add(dog);
        }
        //遍历List
        //listDogs.size()获得集合当前元素的个数
        for(int i = 0; i < dogList.size(); i++)
        {
            Dog dog = dogList.get(i);
            System.out.println(dog.getName());//listDogs.get(i)获得集合中第i个元素的值
        }
        System.out.println("退出了");
    }

Map接口


建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢?

image.png


Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作

最常用的实现类是HashMap


image.png


Map接口常用方法


image.png


遍历List和Map

for(元素类型t  元素变量x : 数组或集合对象){
         引用了x的java语句
}

练习

1.第一题 (Map)利用Map,完成下面的功能:

从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。

历届世界杯冠军

届数  举办年份    举办地点    冠军

第一届 1930年   乌拉圭 乌拉圭

第二届 1934年   意大利 意大利

第三届 1938年   法国  意大利

第四届 1950年   巴西  乌拉圭

第五届 1954年   瑞士  西德

第六届 1958年   瑞典  巴西

第七届 1962年   智利  巴西

第八届 1966年   英格兰 英格兰

第九届 1970年   墨西哥 巴西

第十届 1974年   前西德 西德

第十一届    1978年   阿根廷 阿根廷

第十二届    1982年   西班牙 意大利

第十三届    1986年   墨西哥 阿根廷

第十四届    1990年   意大利 西德

第十五届    1994年   美国  巴西

第十六届    1998年   法国  法国

第十七届    2002年   韩日  巴西

第十八届    2006年   德国  意大利

第十九届    2010年   南非  西班牙

第二十届    2014年   巴西  德国

(Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯


image.png


package com.company;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
 * Created by ttc on 2018/1/10.
 */
public class WorldCupDemo {
    public static void main(String[] args) {
        Map<Integer,String> year2country = new HashMap<>();
        year2country.put(1930,"乌拉圭");
        year2country.put(1934,"意大利");
        year2country.put(1938,"意大利");
        year2country.put(1950,"乌拉圭");
        year2country.put(1954,"西德");
        year2country.put(1958,"巴西");
        year2country.put(1962,"巴西");
        year2country.put(1966,"英格兰");
        year2country.put(1970,"巴西");
        year2country.put(1974,"西德");
        year2country.put(1978,"阿根廷");
        year2country.put(1982,"意大利");
        year2country.put(1986,"阿根廷");
        year2country.put(1990,"西德");
        year2country.put(1994,"巴西");
        year2country.put(1998,"法国");
        year2country.put(2002,"巴西");
        year2country.put(2006,"意大利");
        year2country.put(2010,"西班牙");
        year2country.put(2014,"德国");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入年份");
        int year = scanner.nextInt();
        if(year2country.containsKey(year))
        {
            System.out.println("该年的冠军是" + year2country.get(year));
        }
        else
        {
            System.out.println("该年没有举行世界杯");
        }
        System.out.println("请输入国家名");
        String countryName = scanner.next();
        //遍历map集合,考察每一个元素的value,是否和用户输入的国家一样
        //如果一样,输出和value对应key
        boolean bFind = false;//没有在map中找到该国家
        for(Integer key : year2country.keySet())
        {
            String country = year2country.get(key);
            if(country.equals(countryName))
            {
                System.out.println(key);
                bFind = true;
            }
        }
        //如果前面map遍历一遍之后,bFind的值依然是false,说明map集合中不存在用户输入的国家名
        if(bFind == false)
        {
            System.out.println("该国家没有获得过世界杯冠军");
        }
    }
}


2.第二题 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

2008 北京奥运会男足参赛国家:

科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

提示:分配一个,删除一个


image.png


public static void main(String[] args) {
        //map,保存最终分组结果
        //key保存的是第几组,value是该组对应的国家集合
        Map<Integer,List<String>> groupNum2Countrys = new HashMap<>();
        List<String> stringList = new ArrayList<>();
        String strCountrys = "科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利";
        String[] countrys = strCountrys.split(",");
        for(String str : countrys)
        {
            stringList.add(str);
        }
        //分组,分4组
        //分第1组
        //随机从集合中选出一个国家,放到第1组里;然后将这个选出的国家,从原来集合中干掉(删除)
        //重复以上步骤4次
        for(int j = 0; j < 4; j++)
        {
            List<String> lstGroup = new ArrayList<>();
            for(int i = 0; i < 4; i++)
            {
                Random random = new Random();
                int index = random.nextInt(stringList.size());
                String selectCountry = stringList.get(index);//从大集合中选出一个随机的国家
                //把这个国家加入到第一组
                lstGroup.add(selectCountry);
                //然后将这个选出的国家,从原来集合中干掉(删除)
                stringList.remove(selectCountry);
            }
            //以上已经给第一组分配完国家
            //将该组加入到map中
            groupNum2Countrys.put(j+1,lstGroup);
        }
        //输出分组情况
        //遍历map,输出key-value
        for(Integer integer : groupNum2Countrys.keySet())
        {
            System.out.println("第" + integer + "组" );
            List<String> lstCountrys = groupNum2Countrys.get(integer);
            //输出第一组的所有国家名字
           for(String str : lstCountrys)
           {
               System.out.print(str + "\t");
           }
            System.out.println();
        }
        //分第2组
        //随机从集合中选出一个国家,放到第2组里;然后将这个选出的国家,从原来集合中干掉(删除)
        //重复以上步骤4次
        //分第3组
        //随机从集合中选出一个国家,放到第3组里;然后将这个选出的国家,从原来集合中干掉(删除)
        //重复以上步骤4次
        //分第4组
        //随机从集合中选出一个国家,放到第4组里;然后将这个选出的国家,从原来集合中干掉(删除)
        //重复以上步骤4次
    }

3.第三题 有如下Student 对象,

private String name;  
    private int age;  
    private int score;  
    private String classNum;

其中,classNum 表示学生的班号,例如“class05”。 有如下

List List list = new ArrayList();
list.add(new Student(“Tom”, 18, 100, “class05”));  
list.add(new Student(“Jerry”, 22, 70, “class04”)); 
list.add(new Student(“Owen”, 25, 90, “class05”)); 
list.add(new Student(“Jim”, 30,80 , “class05”)); 
list.add(new Student(“Steve”, 28, 66, “class06”));
list.add(new Student(“Kevin”, 24, 100, “class04”));

在这个list 的基础上,完成下列要求:

1) 计算所有学生的平均年龄

2) 计算各个班级的平均分


image.png


public class Student {
    private String name;
    private int age;
    private int score;
    private String classNum;
    public Student(String name,int age, int score, String classNum)
    {
        this.name = name;
        this.age = age;
        this.score = score;
        this.classNum = classNum;
    }
    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 int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public String getClassNum() {
        return classNum;
    }
    public void setClassNum(String classNum) {
        this.classNum = classNum;
    }
}

package com.company;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by ttc on 2018/1/10.
 */
public class StudentList {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("Tom", 18, 100, "class05"));
        studentList.add(new Student("Jerry", 22, 70, "class04"));
        studentList.add(new Student("Owen", 25, 90, "class05"));
        studentList.add(new Student("Jim", 30,80 , "class05"));
        studentList.add(new Student("Steve", 28, 66, "class06"));
        studentList.add(new Student("Kevin", 24, 100, "class04"));
        //遍历list
        int totalAge = 0;
        for(Student student : studentList)
        {
            totalAge += student.getAge();
        }
        //算平均年龄
        System.out.println("平均年龄"+totalAge/studentList.size());
        //创建一个map保存班级名称和平均分的对应关系
        Map<String,List<Integer>> className2scoreList = new HashMap<>();
//        ["class05":(100,90,80)]
//        ["class04":(70,100)]
//        ["class06":(66)]
        //将学生数据从list结构转变为保存到map结构中
        //遍历list
        for(Student student : studentList)
        {
            //map中是否包含当前班级名称,如果包含,累计该班级分数;否则,将该班级名称和学生分数加入到Map中
            String className = student.getClassNum();
            int score = student.getScore();
            if(className2scoreList.containsKey(className))
            {
                List<Integer> lstScores = className2scoreList.get(className);
                lstScores.add(score);
            }
            else//不包含
            {
                List<Integer> lstScores = new ArrayList<>();
                lstScores.add(score);
                className2scoreList.put(className,lstScores);
            }
        }
        //输出结果
        for(String strName : className2scoreList.keySet())
        {
            System.out.println("班级" + strName);
            //计算该班级的平均分
            List<Integer> lstScores = className2scoreList.get(strName);
            int totalScore = 0;
            for(Integer score:lstScores)
            {
                totalScore += score;
            }
            System.out.println("平均分" + totalScore/lstScores.size());
        }
    }
}

第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:


image.png


package com.company;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * Created by ttc on 2018/1/11.
 */
public class ReverseList {
    public static void reverseList(List<String> stringList)
    {
        //新建一个list
        List<String> stringList1 = new ArrayList<>();
        int index2 = 1;
        for(String string : stringList)
        {
            //得到倒数第index2个元素
            String strLast = stringList.get(stringList.size() - index2);
            //加到新的list
            stringList1.add(strLast);
            index2++;
        }
        int index3 = 0;
        for(String string : stringList1)
        {
            stringList.set(index3, string);
            index3++;
        }
    }
    public static void printList(List<String> stringList)
    {
        int index = 1;
        for(String string : stringList)
        {
            System.out.print("第" + index + "个元素:");
            System.out.println(string);
            index++;
        }
    }
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("zhangsan");
        stringList.add("lisi");
        stringList.add("wangwu");
        stringList.add("liuliu");
        System.out.println("反转之前");
        printList(stringList);
        reverseList(stringList);
//        Collections.reverse(stringList);
//        Collections.shuffle(stringList);//随机打乱list集合中的数据
        System.out.println("反转之后");
        printList(stringList);
    }
}


目录
相关文章
|
7月前
|
存储 Java 索引
JAVASet集合
JAVASet集合
65 0
|
存储 Java 索引
1.9 集合
1.9 集合
40 1
|
存储 Java 容器
集合
集合
74 0
|
设计模式 安全
集合
集合
75 0
|
索引
集合理解
集合的个人理解笔记 与二叉查找树规律
76 0
|
存储 JavaScript 前端开发
集合的实现
集合的实现
集合的实现
|
存储 算法 安全
|
存储 Java 容器
|
存储 安全 Java
第9章 集合
集合体系、集合的数据结构以及操作。
113 0