这是非常低效的。
不是循环遍历每个可能的长度值,然后每个可用的单词,只需循环遍历文档中的可用单词并计算它们的长度?
例如:
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);
}
}
搜索数组是O(n)。 –
问:是否有更有效的方法来生成此直方图?答:实际上,可能没有更多*效率低下的方法:)。 Jeff,dasblinklight和Jon Skeet都推荐基本相同的东西 - 试试:) – paulsm4