删除数组中的Null元素

时间:2013-12-29 00:26:59

标签: java arrays null

我正在读取XML文件以填充一些数据结构,当我检查我的最终结构时遇到这种问题:

arrayName
 [0] = null
 [1] = input
 [2] = null
 [3] = input

输入是我想要的,类型是我自己的类。

我已经习惯了C#所以我会使用LINQ来正常摆脱它们,想在Java中做这样的事情吗?

我将会看看实现它的代码有什么问题,但是现在我需要一个快速的解决方案。

想法?

编辑:

我发现了这个问题,我创建了一个大小为doc.getChildNodes()。getLength()的数组,当我在数组中设置元素时(循环执行),我检查是否

 getNodeType() == Node.ELEMENT_NODE) 

一半时间不起作用。问题是,我根据大小初始化数组,因此数组的一半被填充。

想法?

4 个答案:

答案 0 :(得分:1)

数组在Java中是不可变的(不是它们的内容,数组本身)。没有动态大小的数组或更改长度。因此,您可以首先迭代,计数,创建新数组,复制......或使用适当的数据结构,甚至可以创建新数组,并提供ArrayList等操作方法。

LINQ之类的东西还不存在,你需要一些明确的对象来控制操作或过滤。

答案 1 :(得分:1)

如果您没有过多的数据,可以将它混合到一些集合中。

public class Main {
    public static void main(String[] args) {
        String[] arr = {"haha", "hoho", null, "hihi", null };
        System.out.println(Arrays.toString(arr));

        Set<String> set = new HashSet<>(Arrays.asList(arr));
        set.remove(null);
        arr = new String[set.size()];
        arr = set.toArray(arr);

        System.out.println(Arrays.toString(arr));
    }
}

输出:

[haha, hoho, null, hihi, null]
[hoho, haha, hihi]

请记住,这首先分配原始数组,然后从该数组创建一个列表,然后从该列表创建一个哈希集,最终将所有内容放回原始数组中。

如果您拥有大量数据,可能会让您感到烦躁不安,但除此之外它非常容易阅读,并且只是使用内置功能来达到您想要的效果。

答案 2 :(得分:0)

不幸的是,在Java中没有像LINQ那样的东西。最好的事情可能是事先检查null,并且只在元素不为null时才插入,例如。 (假设您的班级名称为InputClass

InputClass c = parseFromXml(...);
if (c != null) {
    myList.add(c);
}

或者,您可以通过迭代和复制来删除空值(我使用列表作为中间工件):

InputClass[] removeNulls(InputClass[] original) {
    List<InputClass> nonNulls = new ArrayList<InputClass>();
    for (InputClass i : original) {
        if (i != null) {
            nonNulls.add(i);
        }
    }

    return nonNulls.toArray(new InputClass[0]);
}

您也可以使用泛型并改为使用方法<T> removeNulls(T[] original)

答案 3 :(得分:0)

听起来你想要一种方法来为你提供一个删除了null值的新数组;也许是这样的 -

public static <T> T[] removeNulls(T[] in) {
  if (in == null) {
    return in;
  }
  Class<?> cls = null;
  List<T> al = new ArrayList<T>();
  for (T t : in) {
    if (t != null) {
      if (cls == null) {
        cls = t.getClass();
      }
      al.add(t);
    }
  }
  @SuppressWarnings("unchecked")
  T[] out = (T[]) Array.newInstance(cls, al.size());
  return al.toArray(out);
}