如何在java中停止重复打印

时间:2014-03-25 01:55:07

标签: java for-loop

我使用以下代码从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进行分配

3 个答案:

答案 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));