【问题标题】:Count occurrence of ArrayList broken into groups计算 ArrayList 分组的出现次数
【发布时间】:2019-01-15 12:47:01
【问题描述】:

我试图弄清楚如何计算 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");

知道如何实现这一目标吗?

【问题讨论】:

  • 没有内置函数。您必须遍历每个条目并在每次破折号后开始重新计数。
  • 您的问题与安卓无关。不要错误地标记以获得生存能力。
  • @MuratK。是的,我就是这么想的。我正在讨论将每个元素添加到另一个数组列表中,直到我点击破折号,然后以这种方式调用频率函数。要么这样做,要么只是手动完成所有操作
  • 您不必这样做。您可以使用List::subList 方法。但我相信手动扫描会更有效,因为您不需要一次又一次地查找每个值。
  • Splitting List into sublists along elements 有用于分组的解决方案,然后您可以从中计算频率。

标签: java arraylist count


【解决方案1】:

如果你想使用 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 来测试它,但这应该可以 :)

祝你好运!

【讨论】:

    【解决方案2】:

    如果您使用的是 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"));
    }
    

    【讨论】:

      【解决方案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}
      

      【讨论】:

      • 而不是freq.compute(animal, (k, v) -&gt; (v == null) ? 1 : v + 1); 我会推荐freq.merge(animal, 1, Integer::sum)
      【解决方案4】:

      我推荐使用来自番石榴的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
      ---
      

      【讨论】:

        猜你喜欢
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 2015-03-20
        • 1970-01-01
        • 2023-02-24
        • 2015-06-18
        相关资源
        最近更新 更多