2013-09-27 50 views
0

我有2個文件,我正在逐行解析將信息添加到兩個單獨的容器中的ArrayList<String>。我正在嘗試創建一個反映下面的'產生的文件/數組列表'的最終容器「finalPNList」。逐行解析2個文件並且需要避免重複(在特殊情況下)

問題是我沒有成功避免重複。我已經改變了代碼,但沒有成功。有時候我會限制條件太多,並避免所有重複,有時候我會把它放得太寬鬆幷包含所有重複項。我似乎無法找到使其恰到好處的條件。

這裏是到目前爲止的代碼 - 在這種情況下,看到的processLine()內容ins't真正相關的,只知道你得到一個地圖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); 
} 

下面是什麼數據可能看起來像(極度簡化處理約20K線在每個文件中大約10K行):

文件

123;data 
123;data 
456,data 

文件B

123;data 
789,data 
789,data 

生成的文件/ ArrayList的

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

您的預期產出是多少? –

+0

我期望的輸出是在我的文章的結果文件部分中......最後一篇 –

+0

請您詳細解釋一下您希望如何處理重複的規則?從上面的例子中還不清楚。 – Meesh

回答

1
  • !modifier.contains(key)始終是真實的,它可以從你的if語句被刪除。
  • modifier.size() == 0可替換爲modifier.isEmpty()
  • 由於您似乎想要從文件B中添加重複項,因此您需要檢查文件A,而不是在檢查存在時檢查finalPNList(我剛剛檢查了masterList中的適用列表,隨時將其更改爲更合適/更高效的項) 。
  • 您需要在您的第一個if語句後有一個else,否則您要從文件A中兩次添加項目。
  • 我以爲你在輸出中錯過了456,否則我可能不太明白。

與文件IO修改後的代碼替換的東西,更在SSCCE的精神:

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

+0

我會在幾分鐘內給它一個去,讓它知道它是否工作 - 感謝您的時間和精力。確信我會回來確認這是否有訣竅。 –

+0

這條線有所不同:「&& masterList.get(」A「)。contains(s)」感謝您的時間和精力! –