【问题标题】:What is the most efficient method to remove null values within an array.删除数组中的空值的最有效方法是什么。
【发布时间】:2017-12-21 06:26:19
【问题描述】:

我很好奇在数组中删除空值的最有效方法是什么。这是我当前的 null(0) 删除方法。

public static int[] removeNull(int[] array){
        int j = 0;
        for( int i=0;  i<array.length;  i++ )
        {
            if (array[i] != 0)
                array[j++] = array[i];
        }
        int [] newArray = new int[j];
        System.arraycopy( array, 0, newArray, 0, j );
        return newArray;
}

这种方法的性能如何?我期待它是n。

【问题讨论】:

标签: java arrays performance


【解决方案1】:

是的,你的方法的时间复杂度是O(n) - 你的循环有n(数组的长度)迭代,复制数组需要的时间与复制数组的大小成正比,在这种情况下是@ 987654324@ 在最坏的情况下。

而且你不能做得比这更好(就时间复杂度而言),因为你必须遍历整个数组才能找到应该删除的元素。

如果您的目标是降低代码复杂性(即编写最少的代码),您可以使用IntStream(需要 Java 8 或更高版本):

public static int[] removeNull(int[] array) {
    return Arrays.stream(array).filter(i -> i != 0).toArray();
}

正如 Andreas 评论的那样,这种解决方案的优点是保持原始数组不变。

【讨论】:

  • 完全同意。 +1 但是,可以通过将最后 3 行替换为 return Arrays.copyOf(array, j); 来提高代码复杂性
  • @joshLor 是的,虽然 2n 是渐近的 O(n)
  • @Eran 没错,但我坚持使用普通的非流 Java,因为这里有很多人仍然是 Java 8 之前的 Android 用户。 --- 我的另一个 +1 用于添加流解决方案。 (希望我能再做一次 +1)
  • @joshLor 2n is the same thing as O(n) and 2n is also the same thing as O(n) - 你猜对了,两次 :)
  • 建议说明: Stream 解决方案适用于 Java 8+,其优点是不修改原始数组。
【解决方案2】:
Use filter method,

import java.util.Arrays;
import java.util.stream.Collectors;

public class RemoveNullValue {
    public static void main( String args[] ) {
        String[] firstArray = {"test1", "", "test2", "test4", "", null};

        firstArray = Arrays.stream(firstArray)
                     .filter(s -> (s != null && s.length() > 0))
                     .toArray(String[]::new);    

    }
}

【讨论】:

  • int 不太可能是 null。事实上,我不希望它编译。
  • 可以检查值为0的int,需要使用Java 8
  • 仍然无法编译代码,因为输入是int[],而不是ArrayList&lt;Integer&gt;
  • 可以使用 Arrays.stream(arrayList).filter() for int[] from link String[] firstArray = {"test1", "", "test2", "test4", " “, 空值}; firstArray = Arrays.stream(firstArray) .filter(s -> (s != null && s.length() > 0)) .toArray(String[]::new);
  • 您应该编辑答案并修复它,而不是在评论中包含(未格式化的)代码。现在,答案仍然是错误的。
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多