每日练一练
第一道案例:
题目描述
编辑
输入多个学生的成绩信息,包括:学号、姓名、数学成绩、物理成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用ArrayList存储学生信息。
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+数学成绩+英文空格+物理成绩
以“end”为输入结束标志
输出格式:
按数学/物理成绩之和从高到低的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+数学/物理成绩之和
成绩相同的情况,按输入的先后顺序输出。
输入样例:
在这里给出一组输入。例如:
20201124 张少军 83 75
20201136 李四 78 86
20201118 郑觉先 80 62
end
输出样例:
在这里给出相应的输出。例如:
20201136 李四 164
20201124 张少军 158
20201118 郑觉先 142
package Day15.test01;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
// 这是包含 main 方法的主类
class Main{
public static void main(String[] args) {
// 创建一个 ArrayList 来存储 Student 对象
ArrayList<Student> list = new ArrayList<>();
// 创建一个 Scanner 对象来读取用户输入
Scanner sc = new Scanner(System.in);
// 使用 while 循环读取输入,直到用户输入 "end"
while (true){
String str = sc.nextLine();
if (str.equals("end")){
break;
}
// 将输入字符串拆分为一个字符串数组
String[] a = str.split(" ");
// 使用输入值创建一个新的 Student 对象,并将其添加到 ArrayList 中
Student student = new Student(a[0],a[1],Integer.parseInt(a[2]),Integer.parseInt(a[3]));
list.add(student);
}
// 使用自定义的 Comparator 对 ArrayList 进行排序,按照数学和物理成绩之和排序
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return (o2.getMath() + o2.getPhysics()) - (o1.getMath()+o1.getPhysics());
}
});
// 使用 for-each 循环打印排好序的 ArrayList 中的每个 Student 对象
for (Student s :list
) {
System.out.println(s);
}
}
}
// 这是表示学生对象的 Student 类
public class Student{
private String id;
private String name;
private int math;
private int physics;
public Student() {
}
// 构造函数,用于使用提供的值初始化 Student 对象
public Student(String id, String name, int math, int physics) {
this.id = id;
this.name = name;
this.math = math;
this.physics = physics;
}
// 每个私有字段的 getter 和 setter 方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getPhysics() {
return physics;
}
public void setPhysics(int physics) {
this.physics = physics;
}
@Override
public String toString() {
return id + " " + name + " " + (math + physics);
}
}
第二道案例:
要求:根据Main类中main方法中的代码,设计满足要求的Student(学生)类:
1)包含属性:int no(学号)、String name(姓名);
2)满足Main类中main方法代码的说明要求。
Main类中main方法代码的说明:1)首先,从键盘接收形如“3 cuizhenyu 2 tiangang 1 dingchangqing 4 zhangfeng”的字符串,该字符串中包含了4个学生的学号和姓名(各学生以及学生的学号和姓名之间都用一个空格分隔,姓名中只包含英文字母),然后将该字符串内容中的前3个学生的学号及其姓名放到到Student数组stus中;
2)将stus中的3个Student放入到HashSet stuSet中(注意:如果学生的学号相同,则认为是相同对象,不放入stuSet中);
3)将第4个学生对象放入到stuSet中,如果第4个学生对象的学号与stuSet中已有学生对象的学号相同则不能放入。然后,打印出当前stuSet中学生对象的个数;
4)用Arrays.sort方法对数组stus按照学生姓名的字母顺序排序(先比较首字母,首字母相同的比较第二个字母,以此类推),输出排序后的stus中3个学生对象的内容,每个学生对象的输出格式为“no=XX&name=YY”。
import java.util.*;
// 这是表示学生对象的 Student 类
public class Student {
private int no; // 学号
private String name; // 姓名
public Student() {
}
// 构造函数,用于使用提供的值初始化 Student 对象的私有字段
public Student(int no, String name) {
this.no = no;
this.name = name;
}
// getter 和 setter 方法
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 重写 toString 方法,返回包含学号和姓名的字符串
@Override
public String toString() {
return "no=" + no + "&name=" + name;
}
// 重写 equals 方法,比较两个学生对象是否相等(学号相同)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return no == student.no;
}
// 重写 hashCode 方法,根据学号计算哈希值
@Override
public int hashCode() {
return Objects.hash(no);
}
}
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] split = str.split(" ");
Student[] stus = new Student[3]; // 创建一个包含 3 个学生对象的数组
HashSet<Student> stuSet = new HashSet<>(); // 创建一个 HashSet 来存储学生对象
for (int i = 0; i < 6; i++) {
if (i % 2 == 0){
Student student = new Student(Integer.parseInt(split[i]),split[i+1]); // 使用输入值创建一个新的 Student 对象
stus[i/2] = student; // 将新创建的 Student 对象添加到数组中
}
}
Collections.addAll(stuSet, stus); // 将数组中的 Student 对象添加到 HashSet 中
Student student1 = new Student(Integer.parseInt(split[6]),split[7]); // 使用输入值创建一个新的 Student 对象
stuSet.add(student1); // 将新创建的 Student 对象添加到 HashSet 中
Arrays.sort(stus, Comparator.comparingInt(Student::getNo)); // 对数组中的 Student 对象按照学号进行排序
System.out.println(stuSet); // 打印 HashSet 中存储的所有学生对象
System.out.println(Arrays.toString(stus)); // 打印按照学号排序后的学生对象数组
}
}
第三道案例:
斗地主:
牌:有54张
牌的花色:红心♥/方块♦/梅花♣/黑桃♠
每种花色有13张:1-13
还有两张大王小王: 🃏🃏
每张牌包含:花色+数字
功能如下:
- 组装一副牌:新牌 有序的 黑桃>红心>梅花>方块
- 洗牌功能
- 发牌功能:假设玩家(play1 —> play2 -----> play3)有三位,发牌是one by one
- 查看底牌:保留三张,打印底牌的内容
import java.util.*;
// 这是表示一张扑克牌的 Card 类
public class Card {
private Integer type; // 花色
private Integer points; // 点数
private final String[] typeNum = {"♦","♣","♥","♠","大王","小王"}; // 花色对应的字符串
public Card() {
}
// getter 和 setter 方法
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
// 构造函数,用于使用提供的值初始化 Card 对象的私有字段
public Card(Integer type, Integer points) {
this.type = type;
this.points = points;
}
// 重写 toString 方法,返回包含花色和点数(如果不是大小王)的字符串
@Override
public String toString() {
if (points == 14){
return typeNum[type];
}else
return typeNum[type] + " " + points;
}
}
class Main {
public static void main(String[] args) {
List<Card> list = new ArrayList<>(); // 创建一个空的扑克牌列表
// 循环嵌套,生成 52 张扑克牌并添加到列表中
for (int i = 1; i < 14; i++) {
for (int j = 0; j < 4; j++) {
Card card = new Card(j, i);
list.add(card);
}
}
list.add(new Card(4, 14)); // 添加一张大王
list.add(new Card(5, 14)); // 添加一张小王
System.out.println(list); // 输出列表
// 根据花色和点数对列表进行排序
list.sort((o1, o2) -> {
if (!Objects.equals(o1.getType(), o2.getType())) {
return o2.getType() - o1.getType();
} else return o1.getPoints() - o2.getPoints();
});
System.out.println(list); // 输出排序后的列表
Collections.shuffle(list); // 将列表中的元素随机排序
System.out.println(list); // 输出随机排序后的列表
List<Card> play1 = new ArrayList<>(); // 创建一个空的玩家 1 手牌列表
List<Card> play2 = new ArrayList<>(); // 创建一个空的玩家 2 手牌列表
List<Card> play3 = new ArrayList<>(); // 创建一个空的玩家 3 手牌列表
// 将列表中的元素平均分配给三个玩家
while (list.size() >3){
play1.add(list.get(0));
list.remove(0);
play2.add(list.get(0));
list.remove(0);
play3.add(list.get(0));
list.remove(0);
}
System.out.println(play1); // 输出玩家 1 的手牌列表
System.out.println(play2); // 输出玩家 2 的手牌列表
System.out.println(play3); // 输出玩家 3 的手牌列表
System.out.println(list); // 输出剩余的三张牌的列表
}
}