【问题标题】:This Code of mine should return the frequency of the most common element我的这个代码应该返回最常见元素的频率
【发布时间】:2020-08-29 21:32:03
【问题描述】:
Arrays.sort(arr);
int max=1,m=1;
for(int i=1;i<arr.length;i++){
    if(arr[i]==arr[i-1]){
        max++;
    }
    else{
        if(max>m){
            m=max;
            max=1;
        }
       
    }
}
if(max>m){
    m=max;
   
}

return m;

这是我做的一个功能。这应该返回最频繁出现的元素的次数。例如,如果数组是 1,2,2,3,3,3 ,那么它应该返回 3。但是在许多情况下它会失败,例如对于输入 1 2 3 1 2 3 3 3,此代码会失败并返回 5,这是错误的输出。

【问题讨论】:

    标签: java arrays methods


    【解决方案1】:

    我可以编写代码供您使用地图界面回答您的问题。我将检查每个值,如果该值已经有一个键,它将将该值增加 1。如果没有,那么它将创建该键并为其分配一个值 1。

    完成后,我只需要问地图最大的值是多少,这就是我认为你所追求的。如果你愿意,我也可以返回最频繁的值。

    这是经过测试的代码。一个类是工作方法,然后是驱动类和主方法

    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashMap;
    
    public class FindMostFrequent {
    
        public static Integer returnFromArrayHighestFrequency(int[] inArray) {
            HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
    
            for (int i = 0; i < inArray.length; i++) {
                if (hashMap.containsKey(inArray[i])) {
                    hashMap.put(inArray[i], hashMap.get(inArray[i]) + 1);
                } else {
                    hashMap.put(inArray[i], 1);
                }
            }
            Integer maxValue = Collections.max(hashMap.values());
    
            return maxValue;
        }
    
    }
    

    这里是驱动类:

        public static void main(String[] args) {
            int[] testArray = { 1, 2, 2, 3, 3, 3 };
    
            Integer max = FindMostFrequent.returnFromArrayHighestFrequency(testArray);
            System.out.println("highest frequency is:  " + max);
    
        }
    

    我喜欢这种技术,因为它可以让您轻松获得所需的最小值或其他值及其键。

    【讨论】:

    • WJS,谢谢。当我在寻找一种方法时,我错过了关于排序的内容,因此根据您的评论进行了编辑。我第一次回答时确实提供了解决方案。是否需要编码解决方案?我不知道,因为原始帖子实际上并没有说明。我想帮忙,所以给了他一个技巧。我想编码和测试,所以我做到了。
    • 也可以通过hashMap.compute(inArray[i], (k, v) -&gt; v == null ?1 :v + 1);聚合。
    【解决方案2】:

    首先对数组进行排序并计算相同数量的运行是一个好主意。你的逻辑不太合理。

    您需要跟踪当前运行的长度以及最长运行的长度。当数组中的值与先前的值不同时,您当前的运行应该被重置;当当前的运行时间比它长时,应该更新你的最长运行时间。

    类似这样的:

    if (arr.length==0) {
        return 0;
    }
    Arrays.sort(arr);
    int currentRun = 1;
    int longestRun = 1;
    for (int i = 1; i < arr.length; i++){
        if (arr[i]==arr[i-1]){
            ++currentRun;
            if (currentRun > longestRun) {
                longestRun = currentRun;
            }
        } else {
            currentRun = 1;
        }
    }
    
    return longestRun;
    

    【讨论】:

    • @saka1029 是的,确实如此。现已修复。
    • 先生,此代码有效,但您能解释一下吗?这和我的有什么不同?
    • 假设 max 是当前运行长度,您的代码不会将其设置回 1,除非它大于 m
    【解决方案3】:

    另一种使用流的方式,基本上是使用地图来跟踪出现频率,并在对该地图进行排序后获取最高值。

    public static Long getMostFrequentCount( int ... values ) {
        return Arrays.stream(values).boxed().collect(Collectors.groupingBy(Function.identity(),
                Collectors.counting())).values().stream().max(Long::compareTo).orElse( null );
    }
    

    编辑:感谢@saka1029 的出色建议,做得更好

    【讨论】:

    • 您应该使用.values().stream() 而不是.entrySet().stream()
    【解决方案4】:

    这可能是你想要的... 您要使用的所有数字都包含在数组 a 中。

    public class Main {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,7,7,7};
        int count = 1, tempCount;
        int popular = a[0];
        int temp = 0;
        for (int i = 0; i < (a.length - 1); i++) {
            temp = a[i];
            tempCount = 0;
            for (int j = 1; j < a.length; j++) {
                if (temp == a[j])
                    tempCount++;
            }
            if (tempCount > count) {
                popular = temp;
                count = tempCount;
            }
        }
        System.out.println(popular);
    }
    }
    

    【讨论】:

    • 您的代码打印的是the most common element,而不是the frequency of the most common element
    【解决方案5】:

    你的逻辑是完全正确的,除了一行。 ==>如果(最大>米)。 在这种情况下,如果 max == m,则不会重置 max 的值。

    if(max&gt;m){ 替换为if(max&gt;=m){

    【讨论】:

      【解决方案6】:

      您需要在每次迭代中检查 maxm。并且这里使用continue 简化了逻辑。在空数组上打印 -1。

      int[] arr = {1, 2, 3, 1, 2, 3, 3, 3}; 
      Arrays.sort(arr);                       
      int max = 1;                            
      int m = arr.length == 0 ? -1 : 1;                             
      for (int i = 1; i < arr.length; i++) {  
          if (arr[i] == arr[i - 1]) {         
              max++;                          
              if (max > m) {                  
                  m = max;                    
              }                               
              continue;                       
          }                                   
          max = 1;                            
      }                                       
                                                                               
      System.out.println(m);
      

      打印

      4
      

      【讨论】:

      • 谢谢!我修好了它。 (我之前说过,但我的评论被莫名其妙地删除了)。
      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2021-09-21
      • 2019-08-15
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多