我使用以下代码从ArrayList打印项目:
for(int i2 = 0; i2 < a.size(); i2++)
{
word2 = a.get(i2);
for(int j2 = 0; j2 < a.size(); j2++)
{
if(word2.equals(a.get(j2)))
{
counter++;
}
}
if(counter!=0)
{
System.out.println(word2 + " : " + counter);
}
counter = 0;
}
当我打印时,我不想打印出重复的内容。就像现在一样,它会打印
Alphabet : 3
Alright : 3
Apple : 3
Alphabet : 3
Alright : 3
Apple : 3
Alphabet : 3
Alright : 3
Apple : 3
我只想打印
Alphabet : 3
Alright : 3
Apple : 3
如何让它不打印重复项?我必须使用ArrayList进行分配
答案 0 :(得分:2)
另一种选择,虽然性能不是最好的(尽管它对您的应用程序来说已经足够了,并且具有与当前代码类似的性能特征),但是创建一个临时Set
来保存唯一单词列表,然后使用Collections.frequency()
计算原始列表中的出现次数,例如与您的ArrayList<String> a
:
Set<String> unique = new HashSet<String>(a);
for (String word : unique)
System.out.println(word + " : " + Collections.frequency(a, word));
甚至只是:
for (String word : new HashSet<String>(a))
System.out.println(word + " : " + Collections.frequency(a, word));
这里的好处是简短明了的代码。
如果要按字母顺序打印单词,可以使用TreeSet
;如果要按照首次出现的顺序打印,则可以使用LinkedHashSet
。
顺便说一句,上面的内容并不存储以供日后使用的计数,原始代码也没有。但是,如果您想这样做,将结果存储在地图中是微不足道的:
Map<String,Integer> wordCounts = new HashMap<String,Integer>();
for (String word : new HashSet<String>(a))
wordCounts.put(word, Collections.frequency(a, word));
// wordCounts now contains a map of strings -> counts.
答案 1 :(得分:1)
使用TreeMap<String, Integer>
跟踪字数
SortedMap<String, Integer> wordFrequencyMap = new TreeMap<String, Integer>();
for (String str : a) {
if (wordFrequencyMap.containsKey(str)) {
int strFreq = Integer.intValue(wordFrequencyMap.get(str));
strFreq++;
wordFrequencyMap.put(str, new Integer(strFreq));
}
else {
wordFrequencyMap.put(str, new Integer(1));
}
}
for (String word : wordFrequencyMap.keySet()) {
System.out.println(word + " : " + wordFrequencyMap.get(word));
}
这种数据结构不允许重复,它只计算一次遍历列表的每个单词的出现次数。由于您使用带有TreeMap
键的String
,因此在迭代时会按字母顺序打印键
答案 2 :(得分:0)
另一个Java-8流替代方法:
这将在collect
步骤创建一个映射:键是单词(因为Function.identity()
返回每个单词),值是频率(因为Collectors.counting()
返回每个单词频率)。
而forEach
步骤仅打印每个条目"<word>: <word-frequency>"
a.stream().collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()))
.forEach((word, frequency) -> System.out.println(word+": "+frequency));