删除重复元素超过n次

时间:2018-03-03 15:58:56

标签: java arrays

因为你可以看到我试图删除该元素,如果它重复超过n次。

例如: {1,2,4,5,6,5}并且每个元素都可以重复一次然后我应该返回{1,2,4,5,6}

这是我到目前为止所提出的:

 public static int[] deleteNth(int[] elements, int maxOcurrences) {
    int times[] = new int[elements.length];
    for(int i =0;i<elements.length;i++){
        for(int j =0;i<elements.length;j++){
            if(elements[i]==elements[j]){
                times[i]++;
                if(times[i]>maxOcurrences){
                    System.arraycopy(elements, j+1 , elements, j, elements.length - 1 - j);
                }
            }
        }
    }
    return elements;
}

这是对的吗?如果不是我怎么能纠正它 (对我来说很容易,因为我仍然是新手),谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用HashMap将元素存储在键值对中,其中键将是您的数字,值将是它发生的次数。例如,在给定的输入数组中,HashMap将如下所示

1->1
2->1
4->1
5->2
6->1

然后你可以使用contains方法并检查密钥的值,如果key的值大于1,则删除它。

答案 1 :(得分:0)

如果你使用的是java 8(或更高版本),你可以利用收藏家:

  • 您可以对数组的每个元素进行分组,并计算该元素的出现次数。
  • 然后,您可以过滤结果并获取出现次数小于重复次数的元素列表。

一些代码(导入省略):

public class Main {

    public static void main(String[] args) {
        System.out.println(filterByRepeatedTimes(groupByRepeatedTimes(Arrays.asList(1, 2, 4, 5, 6, 5)), 2));
    }

    private static Map<Integer, Long> groupByRepeatedTimes(final List<Integer> arr) {
        return arr.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }

    private static List<Integer> filterByRepeatedTimes(final Map<Integer, Long> repetitionsMap, final int nTimes) {
        return repetitionsMap.keySet()
                .stream()
                .filter(k -> repetitionsMap.get(k) < nTimes)
                .collect(Collectors.toList());
    }
}

或者,如果您只想删除重复项:

System.out.println(Stream.of(1, 2, 4, 5, 6, 5).distinct().collect(Collectors.toList()));

希望有所帮助。