java多维数组删除空/ null元素

时间:2017-01-18 18:52:23

标签: java arrays multidimensional-array

我有object[][],内部和外部数组包含null或空值。

我需要从这些数组中删除所有空值和null值。

我尝试了几种解决方案,例如我从另一个堆栈溢出后修改的解决方案:

public static void Compact(object[][] array)
{
    List<Object[]> outerList = new ArrayList<Object[]>(array.length);
    for(int i = 0; i < array.length; i++) {
        Object[] inner = array[i];
        if (inner != null) {
            List<Object> list = new ArrayList<Object>(inner.length);
            for(int j=0; j < inner.length; j++){
                if(inner[j] != null || !"".equals(inner[j])){
                    list.add(inner[j]);
                }
            }
            outerList.add(list.toArray(new Object[list.size()]));
        }
    }
    array = outerList.toArray(new Object[outerList.size()][]);
}

但是我无法删除空值。它还仅从内部数组中删除null值。

有没有人有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

根据您必须处理的元素数量,您可能希望使用Java 8的fork连接池。如果没有,请删除以下示例代码中的.parallel()

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Compact {

  public static void main(String[] args) {
    Object[][] objects = {
      new Object[]{"Hello", null, null, "World"},
      new Object[]{null, null, ""},
      new Object[]{},
      null,
      new Object[]{new Object()},
      new Object[]{"Hello", "StackOverflow", null},
    };

    List<List<Object>> result = compact(objects);
    System.out.println(result);
  }

  private static List<List<Object>> compact(Object[][] array) {
    return Stream.of(array).parallel()
      // Ignore null objects of the outer array
      .filter(Objects::nonNull)
      // Process all inner arrays
      .map(inner -> Stream.of(inner).parallel()
        // Ignore null objects or empty strings
        .filter(element -> element != null && !"".equals(element))
        // Collect what is left
        .collect(Collectors.toList()))
      // From the result above, ignore all empty arrays
      .filter(inner -> !inner.isEmpty())
      // Collect what is left
      .collect(Collectors.toList());
  }
}

输出:

[[Hello, World], [java.lang.Object@6d9c638], [Hello, StackOverflow]]

答案 1 :(得分:0)

你无法做你所描述的。这是不可能的。

根据您给出的描述和示例代码,似乎数组本身就是您要从中删除所有空值或空值,并且ArrayList只是您尝试创建此类数组的一部分。这是促使我回答的思考过程。

当你创建一个长度为N的数组(即:new Object [N])时,该数组最初是&#34;空的&#34;因为它包含N个空值。示例:new Object[3]提供数组{null, null, null}。您无法删除这些空值以及数组的工作方式&#34;删除&#34;甚至没有意义。

使用上面的new Object[3]示例,我们假设您要删除元素array[1];删除空值后,您期望在array[1]中留下什么? null在该位置基本 该位置为空。您是否希望删除array[1]会为您留下2个元素的数组而不是3个?数组无法正常工作。如果你想要那种行为,那么你需要坚持使用ArrayList而不是数组。

如果要删除array[1]以留下长度为2的数组,那么只需将输入和输出作为一个ArrayList并且根本不使用数组。这样做而不是输入数组的当前代码,将其转换为ArrayList,然后将其转换回数组。

数组的长度是常量。创建数组后,它具有一定数量的元素,并且无法更改该数字。许多编程语言都是如此。例如,C ++的工作原理相同。如果你对数组的误解是因为你来自另一种语言,那么在每次你使用Visual Basic的情况下都要知道#s; redimension&#34;一个数组它实际上抛弃了你正在使用的数组并创建了一个新的数组,并且在甚至不需要你重新定义数组但仍然允许你改变它的大小的语言中,这些语言通常要么做同样的作为Visual Basic的东西,或者他们将语言的数组实现为ArrayList(再次将它重新置于Java术语中)。