Java练习——List集合

Java练习——List集合

第一题

已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数,2008 北京奥运会男足参赛国家:科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

思路分析

  1. 创建一个ArrayList对象list,用来存储国家名字符串。
  2. 使用add方法向list中添加12个国家名。
  3. 创建一个Random对象num,用来生成随机数。
  4. 使用两个嵌套的for循环来进行随机分组。外层循环控制组数,内层循环控制每组的队伍数目。
  5. 在内层循环中,首先打印当前组的序号。
  6. 使用get方法从list中获取一个随机索引,该索引对应的字符串即为随机选取的一个国家。
  7. 使用print方法将选取的国家打印出来。
  8. 使用remove方法从list中删除该国家,确保每个国家只被选取一次。
  9. 在内层循环结束后,打印一个换行符,使得每组的结果在新的一行上显示。

完整代码

package Test1;

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

public class GroupEntity {
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        //以字符串的形式添加到集合
        list.add("科特迪瓦");
        list.add("阿根廷");
        list.add("澳大利亚");
        list.add("塞尔维亚");
        list.add("荷兰");
        list.add("尼日利亚");
        list.add("日本");
        list.add("美国");
        list.add("中国");
        list.add("新西兰");
        list.add("巴西");
        list.add("比利时");
        list.add("韩国");
        list.add("喀麦隆");
        list.add("洪都拉斯");
        list.add("意大利");

        //生成随机数
        Random num = new Random();
        String b;
        //for循环随机分组
        for (int i = 0; i < 4; i++) {//组数
            System.out.println("第"+(i+1)+"组");
            for (int j = 0; j < 4; j++) {//每组的队伍数目
                //生成一个随机索引从列表中获取一个随机队伍。
                b = list.get(num.nextInt(list.size()));
                //将随机选择的队伍添加到输出中,并从列表中删除该队伍
                System.out.print(" " + b);
                list.remove(b);
            }
            System.out.println();
        }
    }
}

第二题

有一个Student 对象,其中,classNum 表示学生的班号,在这个list 的基础上,完成下列要求:
1) 计算所有学生的平均年龄
2) 计算各个班级的平均分

思路分析

  1. 创建学生列表:创建了一个Student对象的列表,并向其中添加了6个学生对象。每个Student对象都有四个属性:名字、年龄、分数和班级。
  2. 计算平均年龄:通过一个循环遍历列表中的所有学生,并计算他们的年龄总和。最后,将年龄总和除以学生数量,得到所有学生的平均年龄。
  3. 计算各班平均分:通过另一个循环遍历学生列表,并统计每个班级的学生人数和分数。然后,根据班级的不同,分别计算每个班级的平均分(即该班级的总分除以该班级的学生人数)。
  4. 输出结果:将所有学生的平均年龄、以及每个班级的平均分打印出来。

完整代码

Student类:

package Test2;

public class Student {
    private String name;//姓名
    private int age;//年龄
    private int score;//分数
    private String classNum;//班级

    public Student() {
    }

    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 Test2;

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

public class TestStudent {
    public static void main(String[] args) {
        List<Student> 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"));

        //求平均分
        //定义sum通过循环获取年龄总和
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += list.get(i).getAge();
        }
        System.out.println("所有学生的平均年龄为:"+sum/list.size());

        System.out.println("------------------------------------");

        //求各班平均分
        //统计各班分数
        int score4 = 0, score5 = 0, score6 = 0;
        //统计各班人数
        int num4 = 0, num5 = 0, num6 = 0;
        for (int i = 0; i < list.size(); i++) {
            //从列表中获取第 i 个学生的信息,并将其存储在 student 变量中
            Student student = list.get(i);
            if (student.getClassNum() == "class04") {
                //当班级为"class04"时, class04人数加1, 计入class04的成绩
                num4++;
                score4 += student.getScore();
            }else if (student.getClassNum() == "class05") {
                //当班级为"class05"时, class05人数加1, 计入class05的成绩
                num5++;
                score5 += student.getScore();
            }else{
                //当班级不是上述两种情况时, class06人数加1, 计入class06的成绩
                num6++;
                score6 += student.getScore();
            }
        }
        //分别打印各班平均分 各班总分/各班人数
        System.out.println("class04的平均分为:"+score4/num4);
        System.out.println("class05的平均分为:"+score5/num5);
        System.out.println("class06的平均分为:"+score6/num6);
    }
}

第三题

写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列

思路分析

  1. 创建了一个新的字符串列表list,并向其中添加元素。
  2. 打印出这个原始的列表。
  3. 调用了reverseList方法来反转这个列表。
  4. 创建了一个新的空字符串列表lists,并通过一个for循环从原列表的最后一个元素开始遍历,将每个元素添加到新列表中。这样,新列表中的元素顺序就是原列表中元素的反向顺序。
  5. 打印反转后的列表。

完整代码

package Test3;

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

/*
写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列
* */
public class ReverseEntity {
    public static void main(String[] args) {
        //初始化一个新的字符串列表
        List<String> list  = new ArrayList();
        //添加元素
        list.add("二十四桥");
        list.add("明月夜");
        list.add("玉人何处");
        list.add("教吹箫");
        System.out.println("倒转前:"+list);
        //调用方法将列表倒转
        reverseList(list);
    }

    public static void reverseList(List<String> list){
        //初始化一个新的字符串列表,存储倒转后的列表
        List<String> lists  = new ArrayList();
        // 通过for循环,从最后一个元素开始遍历原列表,将元素添加到新列表中
        for (int i = list.size() - 1; i >= 0 ; i--) {
            lists.add(list.get(i));
        }
        System.out.println("倒转后:"+lists);
    }
}

第四题

  1. 创建一个List,在List 中增加三个工人;
  2. 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 ;
  3. 删除wang5 的信息 ;
  4. 利用for 循环遍历,打印List 中所有工人的信息 ;
  5. 利用迭代遍历,对List 中所有的工人调用work 方法。

思路分析

  1. 创建了一个名为list的ArrayList对象,用于存储Worker对象。
  2. 通过list.add()方法,向列表中添加了三个工人对象。每个工人对象都由其名字、年龄和工资组成。
  3. 使用list.add(index, new Worker())方法,在特定位置(这里是索引为1的位置)插入了一个新的工人对象。
  4. 使用list.remove(index)方法,删除了索引为3的工人对象。注意,这里的索引是从0开始的,所以实际上是删除了第四个工人对象。
  5. 使用for循环遍历列表,并打印每个工人的信息。
  6. 使用迭代器遍历工人列表,并对每个工人对象调用其work()方法。

完整代码

worker类:

package Test4;

public class Worker {
    private String name;//姓名
    private int age;//年龄
    private double salary;//薪水

    public Worker() {
    }

    public Worker(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void work(){
        System.out.println(name + "work");
    }

    public void information(){
        System.out.println("姓名:"+getName()+"\t年龄:"+getAge()+"\t薪水:"+salary);
    }

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

测试类:

package Test4;

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

public class TestWorker {
    public static void main(String[] args) {
        //创建一个List
        List<Worker> list = new ArrayList<>();
        //在List 中增加三个工人
        list.add(new Worker("zhang3", 18, 3000));
        list.add(new Worker("li4", 25, 3500));
        list.add(new Worker("wang5", 22, 3200));

        //在li4 之前插入一个工人
        list.add(1, new Worker("zhao6", 24, 3300));

        //删除wang5 的信息
        list.remove(3);

        //利用for 循环遍历,打印List 中所有工人的信息
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("--------------------------------------------");

        //利用迭代遍历,对List 中所有的工人调用work方法
        Iterator<Worker> iterator = list.iterator();
        while (iterator.hasNext()) {
            iterator.next().work();
        }
    }
}

总结

  1. LIst存放的元素有序且允许有重复的集合接口
  2. Lis用于存储、删除、更新数据,比数组更加面向对象;
  3. List常用API:
list.size();  →   返回集合类的元素数
list.isEmpty();  →   判断是否有元素(返回值为布尔型)
list.contains("元素内容");  →   判断是否包含指定的元素(返回值为布尔型)
list0.addAll(list3);  →   将list3中的所有元素合并(list3中的元素依然存在)到list0(返回值为布尔型)
Object[] array = list0.toArray();  →   将list转换成数组(使用场景:当调用他人写的方法,且该方法需要的是一个数组时)
list.remove();  →   删除元素,基本不用于遍历删除
list.clear();  →   移除list当中所有元素
list.get(索引位置,修改的元素内容);  →   修改list中的指定位置元素
  1. list.remove()在遍历删除时存在问题,单个删除无影响;
    在这里插入图片描述
    原因:第一次遍历时(remove[0] → “x”);当该元素删除后,集合中只剩下两个元素,同时这两个元素的下标会发生变化(往前移动:即"y"的下标变为0,“z"的下标变为1);此时在第二次便利时remove[1]删除的元素时下标发生改变的"z”,因此留下"y"无法删除。
  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值