Java练习——List集合
第一题
已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数,2008 北京奥运会男足参赛国家:科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利
思路分析
- 创建一个ArrayList对象list,用来存储国家名字符串。
- 使用add方法向list中添加12个国家名。
- 创建一个Random对象num,用来生成随机数。
- 使用两个嵌套的for循环来进行随机分组。外层循环控制组数,内层循环控制每组的队伍数目。
- 在内层循环中,首先打印当前组的序号。
- 使用get方法从list中获取一个随机索引,该索引对应的字符串即为随机选取的一个国家。
- 使用print方法将选取的国家打印出来。
- 使用remove方法从list中删除该国家,确保每个国家只被选取一次。
- 在内层循环结束后,打印一个换行符,使得每组的结果在新的一行上显示。
完整代码
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) 计算各个班级的平均分
思路分析
- 创建学生列表:创建了一个Student对象的列表,并向其中添加了6个学生对象。每个Student对象都有四个属性:名字、年龄、分数和班级。
- 计算平均年龄:通过一个循环遍历列表中的所有学生,并计算他们的年龄总和。最后,将年龄总和除以学生数量,得到所有学生的平均年龄。
- 计算各班平均分:通过另一个循环遍历学生列表,并统计每个班级的学生人数和分数。然后,根据班级的不同,分别计算每个班级的平均分(即该班级的总分除以该班级的学生人数)。
- 输出结果:将所有学生的平均年龄、以及每个班级的平均分打印出来。
完整代码
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 倒序排列
思路分析
- 创建了一个新的字符串列表list,并向其中添加元素。
- 打印出这个原始的列表。
- 调用了reverseList方法来反转这个列表。
- 创建了一个新的空字符串列表lists,并通过一个for循环从原列表的最后一个元素开始遍历,将每个元素添加到新列表中。这样,新列表中的元素顺序就是原列表中元素的反向顺序。
- 打印反转后的列表。
完整代码
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);
}
}
第四题
- 创建一个List,在List 中增加三个工人;
- 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 ;
- 删除wang5 的信息 ;
- 利用for 循环遍历,打印List 中所有工人的信息 ;
- 利用迭代遍历,对List 中所有的工人调用work 方法。
思路分析
- 创建了一个名为list的ArrayList对象,用于存储Worker对象。
- 通过list.add()方法,向列表中添加了三个工人对象。每个工人对象都由其名字、年龄和工资组成。
- 使用list.add(index, new Worker())方法,在特定位置(这里是索引为1的位置)插入了一个新的工人对象。
- 使用list.remove(index)方法,删除了索引为3的工人对象。注意,这里的索引是从0开始的,所以实际上是删除了第四个工人对象。
- 使用for循环遍历列表,并打印每个工人的信息。
- 使用迭代器遍历工人列表,并对每个工人对象调用其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();
}
}
}
总结
- LIst存放的元素有序且允许有重复的集合接口
- Lis用于存储、删除、更新数据,比数组更加面向对象;
- 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中的指定位置元素
- list.remove()在遍历删除时存在问题,单个删除无影响;
原因:第一次遍历时(remove[0] → “x”);当该元素删除后,集合中只剩下两个元素,同时这两个元素的下标会发生变化(往前移动:即"y"的下标变为0,“z"的下标变为1);此时在第二次便利时remove[1]删除的元素时下标发生改变的"z”,因此留下"y"无法删除。