计数出现在ArrayList中的事件

时间:2018-08-08 09:45:21

标签: java arraylist count

我正在尝试弄清楚如何计算ArrayList中由破折号---分解的元素的出现。

ArrayList<String> animals = new ArrayList<String>();
animals.add("dog");
animals.add("cat");
animals.add("bat");
animals.add("bat");
animals.add("---");
animals.add("cat");
animals.add("dog");
animals.add("dog");
animals.add("---");
animals.add("bat");
animals.add("bat");
animals.add("dog");

所以我的ArrayList看起来像这样:

animals = {"dog", "cat", "bat", "bat", "---", "cat", "dog", "dog", "---", "bat", "bat", "dog"}

我希望我的输出按字母顺序显示如下:

bat: 2
cat: 1
dog: 1
---
cat: 1
dog: 2
---
bat: 2
dog: 1

在我破折号之前,我就是通过使用这个

int occurrences = Collections.frequency(animals, "bat");

有什么想法可以实现吗?

4 个答案:

答案 0 :(得分:3)

主要取决于您打算如何使用每个值的频率。如果仅是打印目的,请执行以下操作:

SortedMap<String, Integer> freq = new TreeMap<>(); // to sort keys alphabetically
for (String animal : animals) {
  if (animal.equals("---")) {
    System.out.println(freq);
    freq.clear();
  } else {
    freq.merge(animal, 1, Integer::sum);
  }
}
System.out.println(freq);

将输出:

{bat=2, cat=1, dog=1}
{cat=1, dog=2}
{bat=2, dog=1}

答案 1 :(得分:0)

如果您使用的是Java8,则可以构造出真正令人恐惧的东西,为每个子列表提取索引范围,并将对每个范围内的元素的引用收集到单独的列表中:

int[] indexes = 
  Stream.of(IntStream.of(-1), IntStream.range(0, animals.size())
  .filter(i -> animals.get(i).equals("---")), IntStream.of(animals.size()))
  .flatMapToInt(s -> s).toArray();
List<List<String>> subSets = 
  IntStream.range(0, indexes.length - 1)
           .mapToObj(i -> animals.subList(indexes[i] + 1, indexes[i + 1]))
           .collect(Collectors.toList());

for (List l : subSets) {
    int uiBats = Collections.frequency(l, "bat");
    ...

或像普通人一样遍历列表:

for(String value : animals){
  LinkedList<String> temp = new LinkedList<String>();
  if(value.equals("---")) {
     values.add(temp);
     temp = new LinkedList<String>();
  }else{
     temp.add(value);
  }
}
for(LinkedList<String> list : values){
  System.out.println("Frequency in " + list + " is " + Collections.frequency(list,     "bat"));
}

答案 2 :(得分:0)

我建议使用番石榴中的Multiset

    final Multiset<String> multiset = TreeMultiset.create();
    for (final String animal : animals)
    {
        if (!animal.equals("---"))
        {
            multiset.add(animal);
        } else
        {
            print(multiset);
            multiset.clear();
        }
    }
    print(multiset);
}

private static void print(final Multiset<String> multiset)
{
    multiset.entrySet().forEach(v -> System.out.println(v.getElement() + " = " + v.getCount()));

    System.out.println("---");
}

结果:

bat = 2
cat = 1
dog = 1
---
cat = 1
dog = 2
---
bat = 2
dog = 1
---

答案 3 :(得分:-4)

如果要使用Collections.frequency(..),则可以创建一个

List<List<String>> values = new LinkedList<LinkedList<String>>();

然后遍历动物列表并添加到值列表中

for(String value : animals){
  LinkedList<String> temp = new LinkedList<String>();
  if(value.equals("---")) {
     values.add(temp);
     temp = new LinkedList<String>();
  }else{
     temp.add(value);
  }
}
for(LinkedList<String> list : values){
  System.out.println("Frequency in " + list + " is " + Collections.frequency(list, "bat"));
}

我没有IDE可以测试它,但是应该可以:)

祝你好运!

相关问题