我已经解决了下面的练习但是我有一个问题,我不知道如何区分一个TreeMap的一个键在下面的代码中代表的可能值,例如在darDeBaja
我必须寻找的方法中key
,如果key
至少分配了2个值,我必须分析这2个值中的哪一个对我有用;我怎么知道分配了多少个值key
?
练习:使用 Map 和 TreeMap 完成以下问题。
您有一个学生的信息(姓名、注册号 - 5 个整数的密钥 -、5 个科目的最终成绩)。此信息必须在类中定义,并且必须是私有属性。制作一个具有以下菜单的程序:
[高的]
[低的
[c]咨询
[修改
[离开
以下每个选项都将让您执行以下任务:
高。将注册一个学生的数据,如果要输入更多,则必须返回菜单。必须发送确认数据注册的消息。 你下去 学生将被取消注册(必要时提供姓名)。必须发送一条消息,确认学生退学,以及如果无法完成退学的错误。 协商。只会显示要搜索的学生的数据,他们的注册(以及必要时的姓名),如果没有找到该学生,请在消息中注明。 修改。从学生的注册(以及必要时的姓名)中,可以修改一些资格。应发送一条消息确认修改成功。
离开。该程序将结束。
class Alumnado {
private String nombre;
private int matricula;
private double calificaciones[];
Map<Integer, String> datos = new TreeMap<>();
Alumnado() {
}
Alumnado(String nombre, int matricula, double calificaciones[]) {
datos.put(matricula, nombre);
this.calificaciones = calificaciones;
}
String getNombre() {
return nombre;
}
int getMat() {
return matricula;
}
double[] getCalif() {
return calificaciones;
}
void setCalif(double calif[]) {
calificaciones = calif;
}
}
public class Ejercicio {
public static boolean darDeAlta() {
Scanner y = new Scanner(System.in);
boolean b;
double d[] = null;
Alumnado alum;
System.out.println("Introduzca el nombre del estudiante");
String n = y.nextLine();
System.out.println("Introduzca su matricula (de 5 digitos)");
int m = y.nextInt();
System.out.println("Introduzca las calificaciones \n");
for (int i = 0; i < 5; i++) {
System.out.println("Introduzca la calificacion");
d[i] = y.nextDouble();
}
alum = new Alumnado(n, m, d);
System.out.println("Se han dado de alta los datos :)");
System.out.println("Desea ingresar mas alumnos?");
String s = y.nextLine();
if (s.equals("si")) {
b = true;
} else {
b = false;
}
return b;
}
public static void darDeBaja(String b) {
Scanner y = new Scanner(System.in);
boolean c;
Alumnado al = new Alumnado();
System.out.println("Introduzca la matricula del alumno");
int m = y.nextInt();
c = al.datos.containsKey(m);
if (c) {
al.datos.remove(m);
System.out.println("Se ha dado de baja al alumno");
} else {
System.out.println("No existe esa matricula");
}
}
public static void consultas() {
Scanner y = new Scanner(System.in);
boolean c;
Alumnado al = new Alumnado();
System.out.println("Introduzca la matricula del estudiante a
buscar");
int k = y.nextInt();
c = al.datos.containsKey(k);
if (c) {
System.out.println("Los datos son:" + al.datos.get(k) + " " +
al.getCalif());
} else {
System.out.println("El alumno no se encuentra");
}
}
public static void modificaciones() {
Scanner y = new Scanner(System.in);
boolean c;
Alumnado al = new Alumnado();
System.out.println("Introduzca la matricula del estudiante");
int k = y.nextInt();
c = al.datos.containsKey(k);
if (c) {
double calificacionNva[] = null;
System.out.println("Cuales son las nuevas calificaciones?");
for (int i = 0; i < 4; i++) {
double calif = y.nextDouble();
calificacionNva[i] = calif;
}
al.setCalif(calificacionNva);
System.out.println("Se han modificado las calificaciones
correctamente");
} else {
System.out.println("No existe esa matricula");
}
}
public static void main(String[] args) {
Scanner x = new Scanner(System.in);
boolean bandera;
if (bandera = true) {
System.out.println("[a]ltas" + "\n" + "[b]ajas" + "\n" + "
[c]onsultas" + "\n" + "[m]odificaciones" + "\n" + "[s]alir");
System.out.println("\n Seleccione una opcion");
String opcion = x.next();
if (opcion.compareTo("a") == 0) {
bandera = darDeAlta();
}
if (opcion.compareTo("b") == 0) {
darDeBaja("b");
if (opcion.compareTo("c") == 0) {
consultas();
if (opcion.compareTo("m") == 0) {
modificaciones();
if (opcion.compareTo("s") == 0) {
bandera = false;
}
}
}
}
}
}
}
注意:这个练习已经解决了:),虽然它在darDeAlta
..方法中失败了。
欢迎/赞赏任何建议/帮助。
TreeMap
和Map
, 是不允许在其键中重复值的集合,对于一个键只能有一个值。不同之处在于它TreeMap
是一个实现接口Map
但使用键的自然顺序而不是像它们那样使用equals
and的类。为了让它知道键的自然顺序,键类必须要么实现接口,要么在构造函数中分配一个实例,告诉它如何计算顺序。hashCode
HashMap
LinkedHashMap
TreeMap
Comparable
Comparator
此外
Map
,他们接受所有类型的对象,所以我会在您的方法中将您更改Map<Integer, String> datos = new TreeMap<>();
为Map<Integer, Alumnado> datos = new TreeMap<>();
y,darDeAlta()
即我将使用注册(我理解每个对象将是唯一的)作为每个学生的键将对象放入集合中.还提到你的
Map
, 不应该在类中实例化Alumnado
,类Alumnado
是一个代表学生类型对象的类,但是在一个学生中,你不想要更多学生的信息,只需要他们的信息,这就是为什么集合应该是在类中,该类Ejercicio
将负责执行所有高/低/修改操作。我做了一些修改,看看你是否看得很清楚。
首先,从
Map
文档中的定义开始(由我翻译和突出显示):这意味着您的密钥不能有两个值分配给它。这在设计上是不可能的。我认为在你的情况下,关键是招生,多个值是特定学生的特征......听起来更像是一种风格的映射
matricula -> alumno
?话虽如此,我认为您有一个计划错误......您在学生班级中有您的学生地图,您每次创建新学生时实例化的地图是什么?
想想现实生活中的情况:您不希望每个学生都有一组学生,您需要一个单独的组,将每个新创建的学生放入其中。
重构学生类
在我看来,你的学生班有几个设计错误:
您的课程
Alumno
将如下所示:重构运动类
这是您的主要课程,但这并不意味着它不能具有属性。您可以将属性设为静态(不是一个好主意),也可以创建该方法的新实例
main
并在该实例上调用非静态方法。那是你的决定。在这种情况下,
Map
学生版非常适合您。你会有这样的事情: