2012-10-23 133 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)。