使用 HashMap 将数据输入 Table
Using HashMap for Entering Data into Table
在下面的代码中,我有一个方法应该从文本文件中获取数据(姓氏、名字、班级名称)并判断学生是否在场(出勤),然后填充 table 的值为 "only" students present 一定次数(基本上出现少于输入到文本字段中指定的次数)。我尝试使用散列图,但不确定将 "put" 语句放在哪里才能正确填充散列图。我在 table 中得到了重复的信息,我不想重复。我的代码如下:任何帮助将不胜感激。
public void processFile() throws FileNotFoundException{
DefaultTableModel model = (DefaultTableModel) this.jTable_areasOfConcern.getModel();
File g = new File("pupilSortTemp.txt");
InputStream is;
Scanner scan = null;
HashMap<Integer, String> attendanceList = new HashMap<>();
try {
String firstName;
String lastName;
String className;
String studentKey;
String tab = "\t";
String attendance;
int attendanceCount = 0;
int totalDaysOrLessStudentsPresent;
totalDaysOrLessStudentsPresent = Integer.valueOf(this.jTextField_totalDays.getText());
is = new FileInputStream(g);
scan = new Scanner(is);
String[] array;
String line = scan.nextLine();
if (line.contains(tab)) {
array = line.split(tab);
}
else {
array = line.split("\n");
}
firstName = array[0];
lastName = array[1];
className = array[2];
attendance = array[4];
System.out.println("firstName=" + firstName);
System.out.println("lastName=" + lastName);
System.out.println("className=" + className);
System.out.println("attendance=" + attendance);
if (attendance.equals("Present")){
attendanceCount++;
studentKey = firstName + tab + lastName + tab + className;
attendanceList.put(attendanceCount, studentKey);
System.out.println("attendanceCountIfPresent=" + attendanceCount);
}
System.out.println("attendanceCountIfNotPresent=" + attendanceCount);
while (scan.hasNextLine()) {
line = scan.nextLine();
if (line.contains(tab)) {
array = line.split(tab);
}
else {
array = line.split("\n");
}
System.out.println("array0=" + array[0]);
System.out.println("array1=" + array[1]);
System.out.println("array2=" + array[2]);
System.out.println("array4=" + array[4]);
if (array[0].equals(firstName) && array[1].equals(lastName)){
if (array[4].equals("Present") && (attendanceCount < totalDaysOrLessStudentsPresent)){
attendanceCount++;
//studentKey = firstName + tab + lastName + tab + className;
//attendanceList.put(attendanceCount, studentKey);
System.out.println("attendanceCountIfPresent==" + attendanceCount);
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
}
}else {
if (array[4].equals("Present") && (attendanceCount < totalDaysOrLessStudentsPresent)){
attendanceCount = 1;
System.out.println("attendanceCountIfPresent++=" + attendanceCount);
firstName = array[0];
lastName = array[1];
className = array[2];
attendance = array[4];
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
studentKey = firstName + tab + lastName + tab + className;
attendanceList.put(attendanceCount, studentKey);
}
else {
attendanceCount = 0;
}
}
//attendanceList.put(attendanceCount, studentKey);
}//end while
for (Map.Entry<Integer, String> entry : attendanceList.entrySet()) {
studentKey = entry.getValue();
attendanceCount = entry.getKey();
array = studentKey.split(tab);
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
}
}catch (FileNotFoundException e){
}
finally{
if(scan != null){
scan.close();
}
}
}
我不认为我会像你那样使用 HashMap,如果我这样做,出席人数肯定会不会用作键地图的字段。所有这一切都将保证只有一名具有该出勤率的学生被输入到集合中。创建一个 Student class,为其提供所需的字段,包括姓名,也许还有 studentId,是的,attendanceCount,然后创建一个集合,也许是一个 ArrayList<Student>
。然后,如果您想对其进行排序,可以使用对 attendanceCount 值进行排序的比较器,或者如果您想对其进行过滤,则可以使用相同字段的值对其进行过滤。
此外,我会让我的 Student class 覆盖 equals 和 hashCode,并且会为这些方法使用不变字段,而且绝对 不是 出勤字段。如果学生已经存在于 ArrayList 中,通过在列表上调用 contains(student)
,那么我会增加该学生的出勤率。否则我会在列表中添加一个新学生。
如果您必须使用 HashMap,那么您将反转键和值字段,即,将其作为 HashMap<Student, Integer>
,其中值是出席人数。再次为此工作 Student 需要使用这些方法中的一个或多个不变字段覆盖其 equals 和 hashCode 方法,例如 studentID。
在下面的代码中,我有一个方法应该从文本文件中获取数据(姓氏、名字、班级名称)并判断学生是否在场(出勤),然后填充 table 的值为 "only" students present 一定次数(基本上出现少于输入到文本字段中指定的次数)。我尝试使用散列图,但不确定将 "put" 语句放在哪里才能正确填充散列图。我在 table 中得到了重复的信息,我不想重复。我的代码如下:任何帮助将不胜感激。
public void processFile() throws FileNotFoundException{
DefaultTableModel model = (DefaultTableModel) this.jTable_areasOfConcern.getModel();
File g = new File("pupilSortTemp.txt");
InputStream is;
Scanner scan = null;
HashMap<Integer, String> attendanceList = new HashMap<>();
try {
String firstName;
String lastName;
String className;
String studentKey;
String tab = "\t";
String attendance;
int attendanceCount = 0;
int totalDaysOrLessStudentsPresent;
totalDaysOrLessStudentsPresent = Integer.valueOf(this.jTextField_totalDays.getText());
is = new FileInputStream(g);
scan = new Scanner(is);
String[] array;
String line = scan.nextLine();
if (line.contains(tab)) {
array = line.split(tab);
}
else {
array = line.split("\n");
}
firstName = array[0];
lastName = array[1];
className = array[2];
attendance = array[4];
System.out.println("firstName=" + firstName);
System.out.println("lastName=" + lastName);
System.out.println("className=" + className);
System.out.println("attendance=" + attendance);
if (attendance.equals("Present")){
attendanceCount++;
studentKey = firstName + tab + lastName + tab + className;
attendanceList.put(attendanceCount, studentKey);
System.out.println("attendanceCountIfPresent=" + attendanceCount);
}
System.out.println("attendanceCountIfNotPresent=" + attendanceCount);
while (scan.hasNextLine()) {
line = scan.nextLine();
if (line.contains(tab)) {
array = line.split(tab);
}
else {
array = line.split("\n");
}
System.out.println("array0=" + array[0]);
System.out.println("array1=" + array[1]);
System.out.println("array2=" + array[2]);
System.out.println("array4=" + array[4]);
if (array[0].equals(firstName) && array[1].equals(lastName)){
if (array[4].equals("Present") && (attendanceCount < totalDaysOrLessStudentsPresent)){
attendanceCount++;
//studentKey = firstName + tab + lastName + tab + className;
//attendanceList.put(attendanceCount, studentKey);
System.out.println("attendanceCountIfPresent==" + attendanceCount);
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
}
}else {
if (array[4].equals("Present") && (attendanceCount < totalDaysOrLessStudentsPresent)){
attendanceCount = 1;
System.out.println("attendanceCountIfPresent++=" + attendanceCount);
firstName = array[0];
lastName = array[1];
className = array[2];
attendance = array[4];
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
studentKey = firstName + tab + lastName + tab + className;
attendanceList.put(attendanceCount, studentKey);
}
else {
attendanceCount = 0;
}
}
//attendanceList.put(attendanceCount, studentKey);
}//end while
for (Map.Entry<Integer, String> entry : attendanceList.entrySet()) {
studentKey = entry.getValue();
attendanceCount = entry.getKey();
array = studentKey.split(tab);
model.addRow(new Object[]{array[2], array[1], array[0], attendanceCount, true});
}
}catch (FileNotFoundException e){
}
finally{
if(scan != null){
scan.close();
}
}
}
我不认为我会像你那样使用 HashMap,如果我这样做,出席人数肯定会不会用作键地图的字段。所有这一切都将保证只有一名具有该出勤率的学生被输入到集合中。创建一个 Student class,为其提供所需的字段,包括姓名,也许还有 studentId,是的,attendanceCount,然后创建一个集合,也许是一个 ArrayList<Student>
。然后,如果您想对其进行排序,可以使用对 attendanceCount 值进行排序的比较器,或者如果您想对其进行过滤,则可以使用相同字段的值对其进行过滤。
此外,我会让我的 Student class 覆盖 equals 和 hashCode,并且会为这些方法使用不变字段,而且绝对 不是 出勤字段。如果学生已经存在于 ArrayList 中,通过在列表上调用 contains(student)
,那么我会增加该学生的出勤率。否则我会在列表中添加一个新学生。
如果您必须使用 HashMap,那么您将反转键和值字段,即,将其作为 HashMap<Student, Integer>
,其中值是出席人数。再次为此工作 Student 需要使用这些方法中的一个或多个不变字段覆盖其 equals 和 hashCode 方法,例如 studentID。