仅打印int数组中的重复项以及它们出现的次数

时间:2017-12-09 11:22:09

标签: java

我正在尝试仅打印数组中的重复元素以及每个元素出现的次数。

示例:

Number 0 appears 3 times; 
Number 12 appears 2 times; 
Number 43 appears 2 times

我的代码打印数组的所有元素,而不是仅打印重复的元素。

我必须提到我不能使用HashMap,只能使用conditional statments  谢谢 以下是代码:

    int[] array = new int[] { 12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87 };
    int counter = 0, temp = 0;// variable that holds the temporary value of each element
    Arrays.sort(array);
    for (int i = 0; i < array.length; i++) {
        temp = array[i];
        counter = 0;
        for (int j = 0; j < array.length; j++) {
            if (temp == array[j]) {
                counter++;
            }
        }
        System.out.println("Number:" + array[i] + "occurs :" + counter + " times");
    }

5 个答案:

答案 0 :(得分:1)

试试这个:

package com.stackoverflow.java;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class DuplicatesAndCount {
    public static void main(String[] args) {
    int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};

    // taking hashmap to accumulate corresponding couter of each number
     HashMap<Integer, Integer> ht = new HashMap<Integer, Integer>();                    
     for (Integer newNumber : array) {
        if (ht.get(newNumber) == null) {
            ht.put(newNumber, 1); 
        } else {
            ht.put(newNumber, ht.get(newNumber) + 1);
         }

    }

  System.out.println(ht);
 // now iterate the map
 for (Map.Entry<String, Integer> entry : map.entrySet()) {
    Integer number = entry.getKey();
    Integer count = entry.getValue();
    if (count > 1) {
        System.out.println("Number: " + number + "count: " + count);
    }
  }
}
}

答案 1 :(得分:1)

您可以使用HashMapSimple sorting,因为您的每条评论简单方法如下

  int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};
                int counter = 0, 
                temp = 0;//variable that holds the temporary value of each element
                Arrays.sort(array);
                temp=array[0];
                int count=1;
                for(int i=1;i<array.length;i++)
                {
                    //System.out.println(array[i]);
                    if(temp==array[i])
                    {
                        count++;
                    }
                    else
                    {
                        if(count==1)
                        {
                            count=1;

                        }
                        else{
                        System.out.println(array[i-1]+" "+count);
                        count=1;
                        }
                        temp=array[i];
                    }
                }

答案 2 :(得分:0)

这里的一个简单解决方案是使用地图来计算每个数字的出现次数。然后,迭代地图并报告任何具有两个或更多计数的数字。

int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};
Map<Integer, Integer> map = new HashMap<>();
for (int num : array) {
    Integer count = map.get(num);
    map.put(num, count == null ? 1 : count.intValue() + 1);
}

// now iterate the map
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    Integer num = entry.getKey();
    Integer count = entry.getValue();
    if (count > 1) {
        System.out.println("Number: " + num + ", occurs: " + count + " times");
    }
}

Demo

答案 3 :(得分:0)

这是我的版本:

 Integer[] arr = {1,2,2,2,1,3,5,4,1};
 Arrays.stream(arr).distinct()
                   .forEach(x -> System.out.println(x + " appears " + Collections.frequency(Arrays.asList(arr), x) + " times."));

我们从游戏中移除重复项,因此我们留下了独特的元素,然后对于流中的每个唯一元素,我们打印出它在原始数组中出现的时间。

答案 4 :(得分:0)

这个问题有很多解决方案。我将列出其中一些作为起点,但请将编码留给您。

  1. 使用HashMap并将<Number, Frequency>存储在地图中。
  2. 如果您不允许使用地图,您可以进行双循环并检查所有事件。那将是O(n 2 )。
  3. 稍微好一点的修改是首先对数组进行排序,然后比较连续的元素。这将是O(n log n)。
  4. 您可以使用Collections.frequency(),但这会在列表上运行,因此转换您的数据结构(可能是Streams)。
  5. 使用上述任何一种方法后,您可以过滤出频率为1的数字。