2012-10-23 168 views
1

所以我試圖通過Java中的Arraylist進行搜索,並創建一個直方圖組成的字符串長度與長度存在於大型文本文件中的頻率。我已經提出了一個強力算法,但它太慢,不適合在大型數據文件中使用。通過Arraylist處理有更有效的方法嗎?我已經包含了我提出的強力方法。Arraylist信息收集

for (int i = 0; i < (maxLen + 1); i++) 
{ 
    int hit = 0; 
    for (int j = 0; j < list.size(); j++) 
    { 
     if (i == list.get(j).length()) 
      ++hit; 

     histogram[i] = hit; 
    } 

} 
+0

搜索數組是O(n)。 –

+1

問:是否有更有效的方法來生成此直方圖?答:實際上,可能沒有更多*效率低下的方法:)。 Jeff,dasblinklight和Jon Skeet都推薦基本相同的東西 - 試試:) – paulsm4

回答

2

這是非常低效的。

不是循環遍歷每個可能的長度值,然後每個可用的單詞,只需循環遍歷文檔中的可用單詞並計算它們的長度?

例如:

Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>(); 

for(int i=0; i<list.size(); i++) { 
    String thisWord = list.get(i); 
    Integer theLength = (Integer)(thisWord.length()); 
    if(frequencies.containsKey(theLength) { 
     frequencies.put(theLength, new Integer(frequencies.get(theLength).intValue()+1)); 
    } 
    else { 
     frequencies.put(theLength, new Integer(1)); 
    } 
} 

然後,如果該鍵不中HashMap存在,你不知道該長度的話存在在文檔中。如果密鑰存在,則可以精確查找發生的次數。

備註:此代碼示例的一些方面是爲了防止任何關於裝箱和拆箱的額外混淆。有可能把它寫得稍微乾淨一點,我當然會在生產環境中這樣做。此外,它假定您不知道任何最小或最大長度的單詞(因此稍微更靈活,可擴展且全面)。否則,其他簡單地聲明一個基本數組的技巧也會起作用(參見Jon Skeet的答案)。

更清潔的版本,採用自動裝箱的優勢:

Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>(); 

for(int i=0; i<list.size(); i++) { 
    String thisWord = list.get(i); 
    if(frequencies.containsKey(thisWord.length()) { 
     frequencies.put(thisWord.length(), frequencies.get(thisWord.length())+1); 
    } 
    else { 
     frequencies.put(thisWord.length(), 1); 
    } 
} 
+0

Java有自動裝箱,你知道。 – Adam

+0

是的。 :)看到結尾的評論。我不想添加另一個混亂因素。 – asteri

1

爲什麼你不只是在列表上一次循環?

int[] histogram = new int[maxLen + 1]; // All entries will be 0 to start with 
for (String text : list) { 
    if (text.length() <= maxLen) { 
     histogram[text.length()]++; 
    } 
} 

這現在只是O(N)。