我们有一个方法可以检查一堆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 :(得分:0)
不是标准的JDK类型,但经常使用:来自番石榴的Multimap。
它可以为每个键存储多个条目,当使用entries()
进行迭代时,每个键值对都会得到一个标准Map.Entry
,所以在你的情况下你会得到很多(true,&#34;一些字符串& #34;)和许多(false,&#34;其他字符串&#34;)对。使用Multimap
您的代码无法更改,您只需要创建此Multimap。
您拥有的其他选项只是一个简单的ArrayList
/ LinkedList
,并将您的布尔值String封装到另一种类型(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");
}
}
答案 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更快:)