我正在读取XML文件以填充一些数据结构,当我检查我的最终结构时遇到这种问题:
arrayName
[0] = null
[1] = input
[2] = null
[3] = input
等
输入是我想要的,类型是我自己的类。
我已经习惯了C#所以我会使用LINQ来正常摆脱它们,想在Java中做这样的事情吗?
我将会看看实现它的代码有什么问题,但是现在我需要一个快速的解决方案。
想法?
编辑:
我发现了这个问题,我创建了一个大小为doc.getChildNodes()。getLength()的数组,当我在数组中设置元素时(循环执行),我检查是否
getNodeType() == Node.ELEMENT_NODE)
一半时间不起作用。问题是,我根据大小初始化数组,因此数组的一半被填充。
想法?
答案 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);
}