对数组进行排序并查找重复的数字

时间:2018-06-04 08:24:24

标签: java arrays

package array;

import java.util.Arrays;

public class learning_program1 {

    public static void main(String[] args) {

        int arr[]= {1,2,3,4,10,20,30,6,6,5,4,5,5,2};

        Arrays.sort(arr);
        for(int i = 0; i < arr.length; i++) 
        {   
            int count =0;
            int flag=0;
            for(int j=i+1; j<arr.length; j++)
            {
                while(arr[i] == arr[j])
                {
                    count++;
                    j++;
                    flag=1;
                }
                break;
            }
            if(flag==1)
            {
                System.out.println("the repeated values " + arr[i] + " is " +count);
            }


        }

    }
}

输出:

重复值2为1

重复值4为1

重复值5为2

重复值5为1

重复值6为1

我的问题是 我正在获得输出但是5重复两次

2 个答案:

答案 0 :(得分:1)

您可以使用Stream。首先,您必须按给定值arr对所有元素进行分组并对其进行计数。然后,过滤出多次出现的元素。

public static Map<Integer, Integer> findDuplicates(int[] arr) {
    Map<Integer, Long> map = Arrays.stream(arr)
                                   .boxed()
                                   .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

    Map<Integer, Integer> res = new TreeMap<>();

    map.entrySet().stream()
       .filter(entry -> entry.getValue() > 1)
       .forEach(entry -> res.put(entry.getKey(), entry.getValue().intValue() - 1));

    return res;
}

在这种情况下,您的客户端代码将如下所示:

int arr[] = { 1, 2, 3, 4, 10, 20, 30, 6, 6, 5, 4, 5, 5, 2 };
Map<Integer, Integer> map = findDuplicates(arr);
map.forEach((key, count) -> System.out.println("the repeated values " + key + " is " + count));

输出:

the repeated values 2 is 1
the repeated values 4 is 1
the repeated values 5 is 2
the repeated values 6 is 1

<强> P.S。 如果您在使用Stream时犹豫不决,没有它就很容易做到,只需依靠SetMap

public static Map<Integer, Integer> findDuplicates(int[] arr) {
    Set<Integer> values = new HashSet<>();
    Map<Integer, Integer> map = new TreeMap<>();

    for (int val : arr)
        if (!values.add(val))
            map.put(val, map.getOrDefault(val, 0) + 1);

    return map;
}

答案 1 :(得分:0)

您应该更改用于查找重复项的方法。最好使用HashMap。尝试像这样实现它:

Map<Integer, Integer> findDuplicates(int[] arr) {
    Map<Integer, Integer> map = new HashMap<>();
    for(int i: arr) {
        if(map.containsKey(i)) {
            map.put(i, map.get(i)+1);
        } else {
            map.put(i, 1);
        }
    }

    return map;
}

然后迭代遍历地图中的所有键并检查它有多少元素。

如果您仍想使用代码,则可以使用另一个变量来保留已处理的数字列表。您的代码检查了两次:

  1. 5,4,5,5
  2. 4,5,5
  3. 所以输出看起来像