用于日志条目的数据类型

时间:2016-06-08 09:23:37

标签: java list dictionary logging arraylist

我们有一个方法可以检查一堆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数据类型?

2 个答案:

答案 0 :(得分:0)

不是标准的JDK类型,但经常使用:来自番石榴的Multimap。 它可以为每个键存储多个条目,当使用entries()进行迭代时,每个键值对都会得到一个标准Map.Entry,所以在你的情况下你会得到很多(true,&#34;一些字符串& #34;)和许多(false,&#34;其他字符串&#34;)对。使用Multimap您的代码无法更改,您只需要创建此Multimap。

您拥有的其他选项只是一个简单的ArrayList / LinkedList,并将您的布尔值String封装到另一种类型(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");
    }
}

答案 1 :(得分: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更快:)