2017-02-12 3 views
0

にデータを入力するためにHashMapを使用すると、テキストファイル(姓、ファーストネーム、クラス名)からデータを取り出し、生徒が存在するかどうか(出席)、次に「唯一の」生徒の値がある特定の回数(基本的にテキストフィールドへの入力によって指定された時間よりも短い時間)存在するテーブルを設定します。私はハッシュマップを使用しようとしましたが、ハッシュマップを正しく設定するためには、 "put"ステートメントをどこに置くべきかは不明です。私はテーブルの情報の繰り返しを取得し、私は重複したくないです。私のコードは次のとおりです:どんな助けも大歓迎です。次のコードでテーブル

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を使用したいとは思わない、と私はやった場合は、出席回数は確かマップのキーフィールドとして使用することはできませでしょう。これにより、出席回数が1人の学生のみがコレクションに登録されることが保証されます。 Studentクラスを作成し、必要なフィールド(名前、おそらくstudentId、およびyes、attendanceCountなど)を与え、そのコレクションを作成します。おそらくArrayList<Student>です。次にソートする場合は、attendanceCountの値をソートしたComparatorを使用するか、フィルタリングする場合は同じフィールドの値を使用してフィルタを適用できます。

また、StudentクラスがequalsとhashCodeをオーバーライドし、これらのメソッドに不変フィールドを使用し、最も確かにではなく、出席フィールドをとします。 ArrayListに既にStudentが存在する場合は、リストのcontains(student)を呼び出して、その学生の出席を増やします。それ以外の場合は、新しい生徒をリストに追加します。

ハッシュマップを使用する必要がある場合は、キーと値のフィールドを逆にします(値が出席回数の場合はHashMap<Student, Integer>)。再度これを行うには、Studentは、studentIDなど、これらのメソッド内の不変フィールドまたはフィールドを使用して、equalsおよびhashCodeメソッドをオーバーライドする必要があります。

+0

フィードバックいただきありがとうございます。それは有り難いです。 – Dante

+0

@ダンテ編集をご覧ください。 –

+0

'Map'を作成したら、この[example](http://stackoverflow.com/a/9134371/230513)に従ってください。 – trashgod