2016-06-08 30 views
0

我們有一種方法可以根據它們的Json等價物檢查一堆xml元素。哪種數據類型用於日誌條目

這給了我們一個布爾值來描述它是否匹配和一個字符串來解釋哪些元素進行了比較。

然後,我們希望將這些寫入兩個日誌文件,一個包含所有條目,另一個包含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個條目而不是100個左右的條目。

我們應該使用什麼標準的Java數據類型?

+0

您可以使用一個'地圖<布爾值,列表>'。 – kazbeel

+0

您能否提供一個例子? – Pilauricer

回答

0

不是標準的JDK類型,但經常使用:番石榴的Multimap。 它可以爲每個鍵存儲多個條目,當使用entries()迭代時,您會爲每個鍵 - 值對獲得標準Map.Entry,因此在您的情況下,您將獲得許多(真正的「某個字符串」)和許多(假「 「)對。用Multimap你的代碼不會改變,你只需要創建這個Multimap。

你有

其他選項只是一個簡單的ArrayList/LinkedList和封裝你布爾,字符串爲另一種類型(PairEntry):

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

創建自己的類,用於將logentry與布爾值進行配對,然後使用一些列表,例如數組列表。下面的例子。

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