繁体   English   中英

删除数组中的Null元素

[英]Removing Null elements in an array

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

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

等等

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

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

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

想法?

编辑:

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

 getNodeType() == Node.ELEMENT_NODE) 

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

想法?

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

像LINQ这样的东西还不存在,你需要一些隐藏操作或过滤的显式对象。

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

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]

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

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

不幸的是,在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)代替。

听起来你想要一个方法来为你提供一个删除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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM