2015-03-25 6 views
0

код до сих пор:HashMap путаницы. Чтение/Запись в файлы. Java

public class test1 {                           

public static void main(String[] args) throws IOException {                 
    //declare reader and writer                        
    BufferedReader reader = null;                       
    PrintWriter writer = null;                        

    //hash maps to store the data                       
    HashMap<String, String> names = new HashMap<String, String>();               


    //read the first file and store the data                    
    reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("IRStudents.txt"))));     
    String line;                           
    String[] arg;                           

    while ((line = reader.readLine()) != null) {                   
     if (!line.startsWith("-")) {                      
      arg = line.split(" ");                       


      names.put(arg[0], arg[1]);                      


     }                             
    }                              
    reader.close();                           

//read the second file, merge the data and output the data to the out file 
writer = new PrintWriter(new FileOutputStream(new File("File_2.txt"))); 
reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("Marks.txt")))); 
while((line = reader.readLine()) != null){ 
    arg = line.split(" "); 
    writer.println(arg[0] + " " + names.get(arg[0])); 
    writer.println("Marks: " + arg[1]); 
    writer.println("- - - - - -"); 
}                   


     writer.flush();                          
     writer.close();                          
     reader.close();                          
    }                              
} 

Так выход в текстовом файле выглядит следующим образом:

25220 Fiona 
Marks: 68.3 
- - - - - - 
25212 Greg 
Marks: 70.5 
- - - - - -  

У меня есть еще один текстовый файл с другим набором знаков с таким же раскладом, как первый файл метки ,

Теперь я хочу, чтобы добавить новый набор знаков для набора данных Так оно и должно выглядеть следующим образом:

25220 Fiona 
Marks: 68.3 Marks2: 21.2 
- - - - - - 
25212 Greg 
Marks: 70.5 Marks2: 23.43 
- - - - - -   

Так что я могу сделать, чтобы добавить? Я предполагаю, что я должен добавить новый Hashmap для нового текстового документа? Но когда я пытался делать все это, он никогда не срабатывал полностью.

ИК Студент:

25987 Alan 
25954 Betty 
25654 Chris 
25622 David                          

ответ

1

Вы также можете сделать следующее.

package toBeDeleted; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.Objects; 

public class MarksProcessor { 


    private final Map<String, Record> map = new HashMap<>(); 

    public static void main(String[] args) { 
     String fileName = "file1.txt"; // change it to your specific file. 
     MarksProcessor marksProcessor = new MarksProcessor(); 
     marksProcessor.processFile(fileName, 0); 
     fileName = "file2.txt"; 
     marksProcessor.processFile(fileName, 1); 
     marksProcessor.writeData(); 

    } 

    private void processFile(String fileName, int marksIndex) { 
     try(/*specify your reader resources here*/) { 
      // read the first record and get rollNumber, name and marks. 
      String roll = "valueYouGot"; 
      double value = 0.0; // the value you read. 
      Record record = map.get(roll); 
      // if record is null, you need to create one 
      // and put it into the map. 
      //record.updateMarks(marksndex, value); 
     } 
    } 

    private void writeData() { 

     // if this needs to be written to a file/stream, create a writer. 
     for (Map.Entry<String, Record> entry : map.entrySet()) { 
      String roll = entry.getKey(); 
      Record record = entry.getValue(); 
      if (record != null) { 
       String name = record.getName(); 
       double marks1 = record.getMarks(0); 
       double marks2 = record.getMarks(1); 
       // Now you have all the values. Print them 
       // however you like. Wherever you like. 
      } 
     } 
    } 

    static class Record { 
     private String name; 
     private double[] marks = new double[2]; 


     Record(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public double getMarks(int index) { 
      if (index < 0 || index > 1) 
       throw new IllegalArgumentException("index should be 0 or 1 but" 
         + " the supplied index was " + index); 
      return marks[index]; 
     } 
     public void updateMarks(int index, double value) { 
      if (index < 0 || index > 1) 
       throw new IllegalArgumentException("index should be 0 or 1 but" 
         + " the supplied index was " + index); 
      marks[index] = value; 
     } 


     @Override 
     public String toString() { 
      return "the way you want to type your output"; 
     } 

    } 


} 
+0

@Chad Большое спасибо снова. Пройдя через код, пытаясь понять это сейчас. Будет ли сообщение в чате – bob9123

+0

Метод processFiles действительно является псевдокодом. Вы знаете, что при первом приеме записи для рулона она будет равна нулю. Вам нужно будет построить запись и поместить ее на карту, если она не найдена. Но эта часть для вас завершена. – Chan

0

При добавлении новых знаков, использовать это, чтобы добавить их к уже существующим:

String key = arg[0]; 
String secondMarks = arg[1]; 

String theMarks = names.get(key); 
theMarks = theMarks + " Marks2: " + secondMarks; 
names.put(key, theMarks); 
+0

Я не понимаю, как это будет соответствовать моему коду – bob9123

0

Я думаю, что я понимаю вашу проблему, дайте мне знать, если это это неверно.

Требование, чтобы иметь все знаки, что человек receved на своей собственной линии ...

Theres две печатающие функции в потоке System.out.

печати и Println

arg = line.split(" "); 
writer.println(arg[0] + " " + names.get(arg[0])); 

writer.print("Marks: " + arg[1]); 
for(int i = 2; i < args.length; i++){ 
    writer.println(" Marks" + i + ": " + arg[i]); 
} 

writer.println("\n- - - - - -"); 
+0

Это не связано с новым текстовым файлом второй части меток. Или, может быть, я не понимаю ваш код – bob9123

+0

Как выглядит файл IRStudents? – AnthonyJClink

+0

Я обновил описание – bob9123

1

Я думаю, что вы делаете слишком много манипуляций со строками. И если у вас будет больше файлов с метками для обработки аналогичным образом, манипуляции с строками, вероятно, будут увеличиваться, что может сделать ваш код менее читаемым и может дать больше места для ошибок. Я думаю, что следующий подход будет лучшим.

Вы можете создать класс MarksRecord со следующей структурой.

public class MarksRecord { 
    private String subject; // or whatever this variable name should be. 
          // in your case it should hold value marks1. 
    private double marks; 

} 

Аналогичным образом вы можете создать неизменяемый класс Student/аналогичный класс. Это может быть класс значений с методами equals и hashCode на основе первого числа, которое вы читаете в каждом файле. Я предполагаю, что это число рулонов или подобное, которое может идентифицировать ученика уникальным образом.

public final class Student { 
    private final String rollNumber; 
    private final String name; 

    // equals, hashCode, and other methods. 
} 

Затем в основной метод вы могли бы иметь

Map<Student, ArrayList<MarksRecord>> 

. В качестве альтернативы вы также можете использовать

Map<String, ArrayList<MarksRecord>> 

где первая строка является номером рулона записи Студента.

Этот способ каждый раз, когда у вас есть новый файл меток, ваша структура данных сможет его разместить.

+0

Номер рулона или что-то еще самое содержательное описание того, что его значение будет удерживать. – Chan

+0

спасибо за ответ. У меня есть только файлы с двумя метками. Однако ваш метод может быть лучше, потому что мне нужно сделать некоторое разделение с отметками (получение среднего значения). Или это все еще возможно сделать с моим путем? – bob9123

+0

Да, это возможно и с вашего пути. Хотя я бы настоятельно советовал вам не идти этим путем. И мне нужно написать еще один ответ, чтобы объяснить, как это можно сделать. Дай мне пару минут. – Chan

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