【问题标题】:Using HashMap for Entering Data into Table使用 HashMap 向表中输入数据
【发布时间】:2017-02-12 00:54:40
【问题描述】:

在下面的代码中,我有一个方法应该从文本文件(姓、名、类名)中获取数据并判断学生是否在场(出勤),然后用值填充一个表“只有”学生出现一定次数(基本上少于输入到文本字段中指定的时间)。我尝试使用哈希图,但不确定在哪里放置“放置”语句以正确填充哈希图。我在表格中得到重复的信息,我不想重复。我的代码如下:任何帮助将不胜感激。

   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();
        }
        }
    }

【问题讨论】:

    标签: java arrays swing hashmap jtable


    【解决方案1】:

    我认为我不会像您那样使用 HashMap,如果我这样做了,出席人数肯定会不会用作地图的关键字段。所有这一切都将确保只有一名具有该出勤人数的学生被输入到集合中。创建一个 Student 类,为其提供所需的字段,包括名称,可能是 studentId,是的,出席人数,然后创建一个集合,可能是 ArrayList&lt;Student&gt;。然后,如果您想对其进行排序,您可以使用 Comparator 对出席次数值进行排序,或者如果您想对其进行过滤,您可以使用相同字段的值对其进行过滤。

    另外,我会让我的 Student 类覆盖 equals 和 hashCode,并为这些方法使用不变字段,而且绝对不是出勤字段。如果学生已经存在于 ArrayList 中,通过在列表上调用 contains(student),那么我会增加该学生的出勤率。否则我会在列表中添加一个新学生。

    如果您必须使用 HashMap,那么您将反转您的键和值字段,即,将其设置为 HashMap&lt;Student, Integer&gt;,其中值是出席人数。再次,为了使其正常工作,Student 需要使用这些方法中的一个或多个不变字段(例如 studentID)覆盖其 equals 和 hashCode 方法。

    【讨论】:

    • 感谢您的反馈。我很感激。
    • 一旦你的Map 被构建,按照这个example 来显示它。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多