2013-09-27 3 views
0

두 개의 파일에 두 개의 파일이 있습니다.이 두 파일은 두 개의 별도 ArrayList<String> 컨테이너에 정보를 추가합니다. 아래의 '결과 파일/배열 목록'을 반영하는 최종 컨테이너 "finalPNList"을 만들려고합니다.2 줄로 파일을 파싱하지 않아야하고 중복이 필요하지 않습니다. (특별한 경우)

문제는 중복을 피할 수 없다는 점입니다. 코드를 여러 가지 방법으로 변경하지 않고 성공했습니다. 때로는 조건을 너무 많이 제한하고 모든 중복을 피하고 때때로 너무 느슨하게두고 모든 중복을 포함합니다. 나는 그것을 올바르게 만드는 조건을 찾을 수없는 것 같습니다. 당신이 여기에 2 ArrayLists<String>

public static Map<String, List<String>> masterList = new HashMap<String, List<String>>(); 
public static List<String> finalPNList = new ArrayList<String>(); 
public static List<String> modifier = new ArrayList<String>(); 
public static List<String> skipped = new ArrayList<String>(); 

for (Entry<String, String> e : tab1.entrySet()) { 
    String key = e.getKey(); 
    String val = e.getValue(); 

    // returns BufferedReader to start line processing 
    inputStream = getFileHandle(val); 
    // builds masterList containing all data 
    masterList.put(key, processLine(inputStream)); 
} 
for (Entry<String, List<String>> e : masterList.entrySet()) { 
    String key = e.getKey(); 
    List<String> val = e.getValue(); 
    System.out.println(modifier.size()); 
    for (String s : val) { 
     if (modifier.size() == 0) 
      finalPNList.add(s); 
     if (!modifier.isEmpty() && finalPNList.contains(s) 
       && !modifier.contains(key)) { 
      // s has been added by parent process so SKIP! 
      skipped.add(s); 
     } else 
      finalPNList.add(s);  
    }  
    modifier.add(key); 
} 

와지도를 받고 있다는 것을 무엇을 알고, processLine()의 내용을보고, 정말 관련이 경우 ins't - 여기

지금까지 코드 데이터처럼 보일 수 있습니다 (매우 약 20K 라인 각 파일에 대해 10K 라인을 다루는 간체) :

파일 검색

123;data 
123;data 
456,data 
012 3,516,

파일 B

123;data 
789,data 
789,data 

결과 파일/ArrayList를

123;data 
123;data 
789,data 
789,data 
+0

예상되는 결과는 무엇입니까? –

+0

내가 예상 한 출력물은 내 게시물의 결과 파일 섹션에 있습니다 ... 마지막 부분 –

+0

중복 처리 방법에 대한 규칙을 좀 더 자세히 설명해 주시겠습니까? 위의 예에서 아직 명확하지 않습니다. – Meesh

답변

1
  • !modifier.contains(key) 그것이 당신의 경우 문에서 제거 할 수 있습니다, 항상 사실이다.
  • modifier.size() == 0modifier.isEmpty()으로 바꿀 수 있습니다.
  • 파일 B에서 중복 파일을 추가하고 싶으므로 존재 여부를 확인할 때 finalPNList이 아닌 파일 A를 확인해야합니다 (적용 가능한 목록을 masterList에서 확인 했으므로이 내용을 더 적절하게/효율적으로 변경하십시오) .
  • 첫 번째 if 문 다음에 else이 있어야합니다. 그렇지 않으면 파일 A에서 항목을 두 번 추가하는 것입니다.
  • 출력에 456을 놓친 것으로 생각했습니다. 그렇지 않으면 꽤 이해할 수 없습니다.

    masterList.put("A", Arrays.asList("123","123","456")); 
    masterList.put("B", Arrays.asList("123","789","789")); 
    for (Map.Entry<String, List<String>> e : masterList.entrySet()) { 
        String key = e.getKey(); 
        List<String> val = e.getValue(); 
        System.out.println(modifier.size()); 
        for (String s : val) { 
         if (modifier.isEmpty()) 
          finalPNList.add(s); 
         else if (!modifier.isEmpty() && masterList.get("A").contains(s)) { 
          // s has been added by parent process so SKIP! 
          skipped.add(s); 
         } else 
          finalPNList.add(s);  
        }  
        modifier.add(key); 
    } 
    

    Test : 파일-IO와

수정 된 코드는 SSCCE의 정신에 더 무언가로 대체.

+0

몇 분 후에 진행해보고 효과가 있는지 알려 드리겠습니다. 시간과 노력에 감사드립니다. 이것이 트릭을했는지 확인하려면 다시 돌아올 것입니다. –

+0

이 라인은 모든 차이를 만들었습니다 : "&& masterList.get ("A "). contains (s)"시간과 노력에 감사드립니다! –