2014-01-12 68 views
0

我試圖用掃描儀與形式的「A/B」部分字符串文本文件閱讀,它們存儲在一個數組,然後打印到控制檯上沿每個唯一一個其計數。我可以用精確的計數打印文本文件中的每個單獨條目,但我無法弄清楚如何在沒有任何重複的情況下打印數組的內容。刪除重複數組項

我也想完全主內做到這一點。下面是我到目前爲止有:

公共靜態無效的主要(字串[] args)拋出FileNotFoundException異常 {

ArrayList<String> fracs = new ArrayList<String>(); 
    Scanner input = new Scanner(new File("input.txt")); 
    ArrayList<String> fracsDisplay = new ArrayList<String>(); 

    while(input.hasNext()) 
     fracs.add(input.next()); 

    for(int i = 0; i < fracs.size(); i++) 
    { 
     int count = 0; 
     for(int j = 0; j < fracs.size(); j++) 
     { 
      if(fracs.get(i).equals(fracs.get(j))) 
       count++; 
     } 
     System.out.println(fracs.get(i) + ": " + count); 
    } 

    input.close(); 

}

+0

嗯,你可以添加的元素之前檢查'fracs.contains(...)'如果數組包含已經是一個元素,如果是的話只是增加計數器或避免再次添加元素。一個'Set'默認情況下阻止重複條目。如果你想打印入口名稱和數量,爲什麼不使用'Map'?通過獨特的條目(=鍵)查找計(=值) –

回答

0

如果把握它,這個任務是「字數「的任務。爲了完成這樣的任務,HashMap是最好的選擇。 我建議你使用HashMap來完成這個任務。你的算法的時間複雜度爲O(n^2)。您可以使用HashMap將其減小到O(n)。使用HashMap也可以幫助您重複數據刪除。哈瓦一試。

 HashMap<String, Integer> fracs = new HashMap<String, Integer>(); 
     Scanner input = new Scanner(new File("input.txt")); 

     while(input.hasNext()) { 
      String frac = input.next(); 
      if (! fracs.containsKey(frac)) { 
       fracs.put(frac, 1); 
      } else { 
       fracs.put(frac, fracs.get(frac) + 1); 
      } 
     } 

     input.close(); 

     for (Map.Entry<String, Integer> fracCount : fracs.entrySet()) { 
      System.out.println(fracCount.getKey() + " " + fracCount.getValue()); 
     } 

如果部分字符串應保持一次出現的順序,使用LinkedHashMap的;如果分數字符串應保留字典順序或某些精確的順序,請使用SortedHashMap。在這裏,我建議你閱讀「Java泛型和集合」其中重點Java集合框架

0

是否應該將所有內容都存儲到ArrayList中?您可以使用HashSetTreeSet,因爲不允許發佈。

0

最簡單的方法來擺脫重複的將是使用Set,爲您存儲字符串複製不會被添加。

而不是ArrayList<String> fracsDisplay = new ArrayList<String>();你可以使用:

Set<String> fracsDisplay = new HashSet<>(); 
fracsDisplay.addAll(fracs); 
for (String s : fracsDisplay) { 
    System.out.println(s); 
} 

如果需要某種爲了維持那麼我會建議一個TreeSet,但無論是將處理去除重複的......這似乎是什麼你想在這種情況下。

+0

缺點,如果項目應可在一個有序的結構 –

+0

誠然,在這種情況下,可以使用'TreeSet',OP沒有說明訂單是否很重要或不...答案更新,以反映你的建議! –

0

您可以使用HashSetSet集合不允許重複的值。如果您的陣列順序很重要,那麼您可以使用LinkedHashSet

Set<T> set = new HashSet<T>(); 
Collections.addAll(set, array);