【问题标题】:How to count how many integer elements in array that are equal in java?java - 如何计算数组中有多少个整数元素在java中相等?
【发布时间】:2012-12-08 03:53:14
【问题描述】:

假设我有一个由 3 个整数组成的数组。我希望能够使用 if 语句或 for 循环从这些数组中获取这些结果。

[0,1,2] = 0 equal
[0,1,0] = 2 equal
[0,0,0] = 3 equal

这是我目前所拥有的并且它有效,但我认为它可以简化。

int numequal = 0;

if(intarr[0] != null && intarr[1] != null && intarr[0].numequals(intarr[1])) {
    numequal++;
}

if(intarr[0] != null && intarr[2] != null && intarr[0].numequals(intarr[2])) {
    numequal++;
}

if(intarr[1] != null && intarr[2] != null && intarr[1].numequals(intarr[2])) {
    numequal++;
}

if(numequal == 1) {
    numequal = 2;
}

另外,我试图保持基本。也许只是 for 循环。没有哈希集或字典。

【问题讨论】:

  • 您可能已经注意到您的代码仅适用于大小为 3 的数组。您应该努力编写一个适用于任何大小(包括 0)的数组的可重用方法。一些提示:你需要一个循环(事实上,你需要一个嵌套循环)。
  • 看起来不太可扩展 - 如果数组有 1000000 个元素怎么办?你的代码会是什么样子?
  • 我想只用一个 for 循环来做。
  • 老兄,他正在学习编程。让他先学会走路。
  • 使用 for 循环,您可以通过遍历介于 0 和 "array_size - 1" 之间的整数索引来遍历数组的元素。

标签: java arrays integer counting


【解决方案1】:

您可能正在寻找非常简单的解决方案,因此我尝试稍微优化您的代码:

int[] intarr = {'0','1','2'};
int numequal = 0; 

if(intarr[0] == intarr[1] || intarr[0] == intarr[2] ){
    numequal++;
}
if( intarr[1] == intarr[2]){
    numequal++;
}

if (numequal > 0 ){
    numequal++;
}

如果您的数组声明为int[],则无需检查nulls
intarr[1] != null

如果某些项目没有设置,则默认为0

【讨论】:

    【解决方案2】:

    这是我的解决方案。这并不简单,但非常有效。目前它也计算空元素,如果不需要,可以很容易地修复它。

        Integer[] a = { null, 2, 1, null, 0, 1 };
        Arrays.sort(a, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 == null) {
                    return -1;
                }
                if (o2 == null) {
                    return 1;
                }
                return o1.compareTo(o2);
            }
        });
        // [null, null, 0, 1, 1, 2]
        int n = 0;
        Integer prev = null;
        Boolean first = null;
        for (Integer e : a) {
            if (first != null && (e == prev || e != null && e.equals(prev))) {
                if (first == Boolean.TRUE) {
                    n += 2;
                    first = Boolean.FALSE;
                } else {
                    n++;
                }
            } else {
                first = Boolean.TRUE;
            }
            prev = e;
        }
        System.out.println(n);
    

    【讨论】:

    • 对我来说似乎太复杂了。既然您的比较函数考虑了null,为什么不只遍历第一个非空元素(O(N))然后只比较相邻元素?不需要考虑极端情况,即null?另外你为什么使用Boolean而不是boolean
    • 由于它不是原始数组并且允许空值,因此您需要特殊的 Comparator 否则 Arrays.sort 将失败。使用布尔值是因为它也是处理 a[0] 的标志。
    • Since it is not a primitive array and nulls are allowed you need that special Comparator otherwise Arrays.sort would fail. 这跟我的评论有什么关系?
    • 我的意思是 Comparator 为程序增加了复杂性
    • 您的比较器将所有 null 值放在数组的开头,然后是实际值。所以在排序之后,只需跳过null 条目(O(N)),然后开始寻找相等的相邻对。数组的这个区域不需要任何角落案例
    【解决方案3】:

    我相信这是最简单的方法(有些人可能会有所不同):

    int[] x = { 1, 1, 2, 4, 6, 7, 5, 6, 4, 2, 3, 1, 6, 6, 5, 6, 5, 6, 4, 5, 9,
        7, 8, 6, 5, 4, 6 };
    int rep = 0;
    int finalc = 0;
    
    for (int i = 0; i < x.length; i++) {
      int basec = 0;
      for (int j = 0; j < x.length; j++) {
        if (x[i] == x[j]) {
          basec++;
        }
      }
      if (basec > finalc) {
        finalc = basec;
        rep = x[i];
      }
    }
    
    System.out.println("The number " + rep + " is repeated " + finalc +" times");
    

    这将打印:

    The number 6 is repeated 8 times
    

    【讨论】:

      【解决方案4】:

      这是一道算法题,可以优化......

      我会使用非同步键值存储,对于键,我会将 int 作为字符串,对于他的计数值。

      首先你会尝试得到它: hashMap.get("0") 如果它返回 null,然后计数为 0,然后把它放回去: hashMap.put("0", new Integer(1)) .

      除非你不需要,不如使用非同步版本的hashMap,用google搜索吧!

      【讨论】:

        【解决方案5】:

        您可以使用 Array.sort 并很好地计算它们:

            int[] a = {0,1, 2, 1, 3, 0, 1 };
            int size = 0;
            int counter = 0;
            //sort it and you will get all the equal inters in a sequance.
            Arrays.sort(a);// {0,0,1,1,2,3}
            for(int i = 1; i < a.length; i++){          
                if ( a[i-1] == a[i]){
                    counter++;
                    if(counter  > size){
                        size = counter;
                    }
                }else{
                    counter = 0;
                }
            }
            return size;
        

        【讨论】:

        • i = 1 开头并删除if(i == 0)
        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 2021-10-19
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多