【问题标题】:removing repeated elements for more than n times删除重复元素超过 n 次
【发布时间】:2018-08-11 16:06:34
【问题描述】:

如您所见,如果元素重复超过 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;
}

这是对的吗?如果不是,我该如何纠正 (我还是个新手,请放轻松),谢谢

【问题讨论】:

  • 我强烈建议使用arraylist而不是数组,并在使用contains时让arraylist处理remove元素的逻辑,尽管使用set
  • 你的嵌套循环的条件应该是j&lt;elements.length
  • 你应该使用j = i + 1。不需要做更多的工作
  • 对数组进行排序可以吗?如果是,首先对数组进行排序并遍历数组并在遍历数组时用下一个唯一元素替换重复项,最后替换的索引将为您提供新数组的长度,然后执行 Arrays.copyOf( ...)。如果无法对数组进行排序,则创建一个 arraylist ,如果不存在则添加到其中,然后使用 list.toArray() 返回数组
  • @GalAbra 感谢您指出这一点:)

标签: java arrays


【解决方案1】:

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

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

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

【讨论】:

  • 大于 maxOcurrences
【解决方案2】:

如果您使用的是 java 8(或更高版本),则可以利用 Collectors:

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

一些代码(省略导入):

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()));

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2023-03-28
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多