2016-06-08 29 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