2016-06-08 2 views
0

우리는 Json에 해당하는 xml 요소를 검사하는 메소드가 있습니다.로그 항목에 사용할 데이터 유형

이렇게하면 일치하는지 여부를 나타내는 부울을 제공하고 비교할 요소를 설명하는 String을 제공합니다.

그런 다음이 항목을 모든 항목이 들어있는 로그 파일과 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

당신은'지도 <불, 목록 >'을 사용할 수 있습니다. – kazbeel

+0

예제를 제공해 주시겠습니까? – Pilauricer

답변

0

표준 JDK 유형은 아니지만 자주 사용되는 : Multimap guava. 각 키에 대해 여러 항목을 저장할 수 있으며 entries()을 사용하여 반복 할 때 각 키 - 값 쌍에 대해 표준 Map.Entry을 얻습니다. 따라서 많은 경우 (사실, "일부 문자열") 많은 경우 ("거짓,"다른 문자열 ") 쌍. 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

logentry를 부울로 페어링하기위한 클래스를 만든 다음 몇 가지 목록을 사용하십시오. 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()는 LogWriter의 인스턴스입니다.) – Pilauricer

+0

코드를 보지 않고 정적 인 것을 만들어야하는 이유를 말할 수 없습니다. 또한 LogWriter는 내 샘플 수업. – sotix

관련 문제