2017-02-12 12 views
0

в следующем коде, у меня есть метод, который должен принимать данные из текстового файла (lastname, firstname, classname) и указать, присутствовал ли учащийся или нет (посещаемость), затем заполнять таблицу со значением «только» учащиеся, которые присутствуют определенное количество раз (в основном присутствуют меньше времени, заданного вводом в текстовое поле). Я пробовал использовать hashmap, но я не уверен, куда положить «put» (ые) оператор (ы), чтобы правильно заполнить хэш. Я получаю повторы информации в таблице, и я не хочу дубликатов. Мой код выглядит следующим образом: Любая помощь будет принята с благодарностью.Используя HashMap для ввода данных в таблицу

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

ответ

2

Я не думаю, что я хотел бы использовать HashMap, как вы делаете это, и если бы я сделал, граф, конечно, будет не быть использован в качестве ключевого поля для карты посещаемости. Все это будет гарантировать, что в коллекцию будет входить только один студент с таким количеством посещаемости. Создайте класс Студента, дайте ему необходимые поля, включая имя, возможно studentId, и да, attendanceCount, и создайте коллекцию этого, возможно, ArrayList<Student>. Затем, если вы хотите отсортировать его, вы можете использовать Comparator, который отсортировал значения посещаемости, или если вы хотите его отфильтровать, вы можете отфильтровать его, используя одно и то же значение поля.

Кроме того, у меня будет класс переопределения класса Student и hashCode, и он будет использовать инвариантные поля для этих методов, и определенно не поле посещаемости. Если ученик уже существует в ArrayList, вызывая contains(student) в списке, я увеличиваю посещаемость этого ученика. В противном случае я добавлю нового ученика в список.

Если вам нужно использовать HashMap, вы можете отменить свои поля ключа и значения, т. Е. Иметь его как HashMap<Student, Integer>, где значение - подсчет посещаемости. Снова для этого, чтобы работать, Студенту необходимо было бы, чтобы его методы equals и hashCode переопределялись с использованием инвариантного поля или полей внутри этих методов, таких как studentID.

+0

Благодарим вас за отзыв. Я ценю это. – Dante

+0

@ Данте, пожалуйста, см. Правки. –

+0

Как только ваша «Карта» построена, следуйте этому примеру [http://stackoverflow.com/a/9134371/230513], чтобы отобразить его. – trashgod

 Смежные вопросы

  • Нет связанных вопросов^_^