【问题标题】:java int[] arrays - need to change all values from 1 to 0java int[] 数组 - 需要将所有值从 1 更改为 0
【发布时间】:2017-11-16 11:48:27
【问题描述】:

例如,如果我们有一个数组:

 2 5 1 32 0 3 3 2 11 1

将所有 1 更改为 0 的最佳方法是什么?

结果应该是:

2 5 0 32 0 3 3 2 11 0

我能想到的就是运行 for 循环并在满足条件时替换。

有内置的java函数吗?

【问题讨论】:

  • 你不能做得比迭代数组更好(性能方面)。
  • 如果“最佳”是指“具有最佳性能并消耗最少内存”,则 for 循环就地替换值是最佳的。

标签: java arrays replace


【解决方案1】:

您可以使用 IntStream:

 int[] result = IntStream.of(array)
                          .map(i -> array[i] == 1 ? 0 : array[i])
                          .toArray();

【讨论】:

  • 你为什么使用 Intstream.range() 而不是 IntStream.of()?
  • @baao 因为我真的不知道 Streams。我快速查看了互联网上的 API 和示例,并尝试了一些方法。非常感谢您的评论。它确实是一个 var-args。显然是无奈。我更新了。
  • :D 这是一个更真实的问题,我不确定使用范围是否有优势。
  • @baao :-p 啊。我已经查看了实现。似乎并没有真正的区别。最后,两者都依赖StreamSupport.intStream(Spliterator.OfInt spliterator, boolean parallel) 方法。
【解决方案2】:

在使用Arrays.asList() 方法创建由指定数组支持的列表后,另一种选择是使用Collections 类中的replaceAll 静态方法

public static void main(String[] args) {

   Integer []a = {1,2,5,1,0,5,9};
   List<Integer> li = new ArrayList<>();
   li = Arrays.asList(a);
   Collections.replaceAll(li, 1, 0);
   for (int i: a)
      System.out.println(i);
}

这会打印出以下结果: 0 2 5 0 0 5 9

【讨论】:

    【解决方案3】:

    如果这是最重要的,不确定您是否觉得这更具可读性,性能可能更差。

        int[] ints = { 2, 5, 1, 32, 0, 3, 3, 2, 11, 1 };
        int[] noOnes = Arrays.stream(ints).map(i -> i == 1 ? 0 : i).toArray();
        System.out.println(noOnes);
    

    【讨论】:

    • 取决于,如果数组足够大,parrellization 可能会抵消初始化的成本。
    • 我相信如果数组是 10^5 会更好
    【解决方案4】:

    简单的for 循环是最好的方法。

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多