2016-06-08 3 views
0

У нас есть метод, который проверяет кучу xml-элементов на их эквиваленты Json.Какой тип данных использовать для записей журнала

Это дает нам булевое описание, если оно соответствует, и строку, чтобы объяснить, какие элементы были сопоставлены.

Затем мы хотим записать их в два файла журнала, один из которых содержит все записи и другой, содержащий только False записи (те, которые не совпадают).

Желательно, чтобы порядок записей оставался по мере их добавления.

Я попробовал LinkedHashMap, но это не позволяет более чем один проход или не (как булева ключ)

Но это было заманчиво, поскольку он сделал метод протоколирования просто написать как:

public void writeLogFile() throws IOException{ 
    FileWriter standardLog = new FileWriter(System.getProperty("user.home") + "/Desktop/comparisonsStandard.csv", false); 
    FileWriter failureLog = new FileWriter(System.getProperty("user.home") + "/Desktop/comparisonsFailures.csv", false); 

    for (Map.Entry<Boolean,String> entry : log.entrySet()) { 
     standardLog.append(entry.getKey().toString() + "," + entry.getValue() + "\r\n"); 

     if (entry.getKey() == false){ 
      failureLog.append(entry.getKey().toString() + "," + entry.getValue() + "\r\n"); 
     } 
    } 

    standardLog.close(); 
    failureLog.close(); 
} 

Очевидная проблема заключается в том, что файлы журнала содержат только 1 или 2 записи, а не сто или около того.

Какой стандартный тип данных Java мы должны использовать вместо этого?

+0

Вы можете использовать 'Map >'. – kazbeel

+0

Не могли бы вы привести пример? – Pilauricer

ответ

0

Нестандартный тип JDK, но часто используется: Multimap от guava. Он может хранить несколько записей для каждого ключа, а при итерации с использованием entries() вы получаете стандартный Map.Entry для каждой пары значений ключа, поэтому в вашем случае вы получите много (true, «some string») и много (false, «other string "). С Multimap ваш код не изменился бы, вам просто нужно создать этот Multimap.

Другой вариант, что у вас есть только простой ArrayList/LinkedList и инкапсулировать логическое значение, строка в другой тип (Pair или Entry):

public class Pair { 
    private final boolean matched; 
    private final String log; 

    public Pair(boolean matched, String log) { 
     this.matched = matched; 
     this.log = log; 
    } 

    public boolean isMatched() { 
     return matched; 
    } 

    public String getLog() { 
     return log; 
    } 

} 

И ваш код будет выглядеть следующим образом (подставьте журнал Collection<Pair> log = new ArrayList<>()) :

for (Pair pair : log) { 
    standardLog.append(entry.getKey().toString() + "," + entry.getValue() + "\r\n"); 

    if (entry.isMatched() == false){ 
     failureLog.append(Boolean.toString(entry.isMatched()) + "," + entry.getLog() + "\r\n"); 
    } 
} 
+0

Знаете ли вы о других способах этого, используя стандартный JDK? – Pilauricer

0

Создайте свой собственный класс для сопряжения логического узла с булевым, а затем используйте некоторый список, например ArrayList. Пример ниже.

import java.util.ArrayList; 
import java.util.List; 


public class LogWriter { 

    private class LogEntry{ 
     public final boolean isValid; 
     public final String logContent; 
     public LogEntry(boolean isValid, String logContent){ 
      this.isValid = isValid; 
      this.logContent = logContent; 
     } 
    } 

    private List<LogEntry> logEntries = new ArrayList<LogWriter.LogEntry>(); 

    public void addLogEntry(String logXML, String logJSON){ 

     // replace this with your existing comparison 
     boolean isValid = logXML.equals(logJSON); 
     String logContent = logXML; 

     // adding the entry 
     this.logEntries.add(new LogEntry(isValid, logContent)); 

    } 

    public void writeLogFile(){ 

     // .. 

     for(LogEntry entry : this.logEntries){ 
      // log all 
      System.out.println(entry.logContent); 

      // log invalid 
      if(!entry.isValid){ 
       System.out.println("invalid: "+entry.logContent); 
      } 
     } 

     // .. 


    } 
} 

Ну Krzyk был быстрее :)

+0

Мне пришлось изменить все на статичные, и теперь я получаю сообщение об ошибке в методе AddLogEntry: Нет доступного экземпляра типа LogWriter. Должен квалифицировать выделение с помощью экземпляра типа LogWriter (egxnew A(), где x является экземпляром LogWriter – Pilauricer

+0

Без просмотра вашего кода я не могу сказать, зачем вам нужно что-либо статичное. Также LogWriter - это просто имя мой образец класса. – sotix

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