【问题标题】:How to get the five least repeating elements in an array如何获取数组中重复最少的五个元素
【发布时间】:2017-09-30 10:07:25
【问题描述】:

如果我有以下字符串数组。

String inStrings[] = {"A", "B", "C", "D", "E", "F", "G", "H", "A", "B", "C", "D", "E", "A", "B", "C", "D", "A", "B"};

这个数组后来被传递给一个方法,我不知道如何继续。

    static void getColdSearch(String[] inArray){



}

这个方法应该做的是取数组,获取重复最少的字符串,然后在输出中打印出重复最少的五个字符串。重复的字符串不必彼此相邻,如果字符串少于五个,那么所有字符串都应该是输出的一部分。例如。如果 arraylist 看起来像上面的示例,则输出应该看起来像这样。

F //(Occurs once)
G //(Occurs once)
H //(Occurs once)
E //(Occurs twice)
D //(if two different elements repeat the same number of times a random one of them should be printed)

我该怎么做?

【问题讨论】:

  • 使用Map,以数组中的字母为键,值为计数器。然后找到具有最低值的 5,然后您就设置好了。开始吧。
  • 步骤 1. 计算每个元素。步骤 2 从最少到最频繁地计算计数。第 3 步返回第 2 步中构建的排序列表的第一个文件元素。
  • 你应该先尝试something。如果它不起作用,请寻求帮助。不要要求我们为您解决问题。
  • 这听起来像是一项家庭作业——到目前为止,您尝试了哪些方法,您的问题到底出在哪里?
  • 这是一个任务,我不知道从哪里开始,所以感谢这个,我会尝试使用 HashMap,谢谢!

标签: java arrays search output


【解决方案1】:

试用 java 8 功能

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class GroupingDemo {

    public static void getColdSearch(String[] inArray) {
        Map<String, Long> groupingByLetter = Arrays.stream(inArray)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        List<String> result = groupingByLetter.entrySet().stream()
            .sorted(Map.Entry.comparingByValue())
            .limit(5)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

        System.out.println(result);
    }

    public static void main(String[] args) {
        String inStrings[] = {"A", "B", "C", "D", "E", "F", "G", "H", "A", "B", "C", "D", "E", "A", "B", "C", "D", "A", "B"};
        getColdSearch(inStrings);
    }
}

【讨论】:

    【解决方案2】:

    使用最大堆(优先队列)和哈希映射。

    创建一个类

             Class WordCount
              {
                 String word;
                 int count;
               }  
               PriorityQueue<WordCount>queue // queue to save minimum repeated words
               HashMap<String,Integer>map // save data for each word   
    

    遍历数组

    将前 5 个唯一单词保存在队列中

    检查地图中的数据。如果单词存在更新计数

    检查队列中的顶部元素。如果单词的计数高于当前索引单词,则从队列中删除该单词并添加该单词。 重复这个过程直到循环结束。

    最后轮询队列中的所有元素

    【讨论】:

      【解决方案3】:

      您可以使用如上所述的 Java 8。这是一个解决方案,可能有助于理解如何在 Java 7 或更早版本中执行相同的操作。另外,我认为了解幕后真正发生的事情会很有帮助。

      static void getColdSearch(String[] inArray) {
          Map<String, Integer> counterMap = new HashMap<>();
      
      
          // load the array in a Map instance
          for (String in : inArray) {
              if (null != counterMap.putIfAbsent(in, 1) ) {
              counterMap.put(in, counterMap.get(in) + 1);
              }
          }
      
          // Question: why do we need a priority queue?
          // We could also use sort based on the values. Search 
          // stackoverflow.com for "sorting on map value"
          PriorityQueue<String> heap = new PriorityQueue<>(new Comparator<String>() {
      
              @Override
              public int compare(String o1, String o2) {
              // sort based on the count.
              return counterMap.get(o1).compareTo(counterMap.get(o2));
              }
      
          });
      
      
          heap.addAll(counterMap.keySet());
      
          int size = heap.size();
          for (int i = 0; i < size; i++) {
              // you could end it a "5" but I leave that as an exercise.
              String s = heap.poll();
              System.out.println( s + " count: " + counterMap.get(s));
          }
      }
      

      【讨论】:

      • 非常感谢!这真的很有帮助!
      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2014-10-21
      相关资源
      最近更新 更多