我试图用空字符之前的最后一个值替换Java列表中的空值。类似的问题已在SQL中发布,但我必须忽略任何Java解决方案。
想象一下,我有一个容器:
[1,2,3, null, null, 8, null, 9, null, null]
是否有开箱即用的合并或类似功能可以用最后一个非空值替换每个空值? EG:
[1,2,3,3,3,8,8,9,9,9]
我不想写一个,因为我需要它来处理整数,双打,字符串等...
成为java的新手,是否可以编写一个这样的实现,它可以在任何对象类型上工作?
答案 0 :(得分:2)
这不是最佳解决方案,但它是一种功能最强大的方法。请记住,由于我们在合并时没有clone
对象,我们最终会存储对同一对象的多个引用。值得考虑的是非不可变类型。
使用泛型:
class Utility<T> {
public void coalesce(T[] a, T mask) {
if (a[0] == null) {
a[0] = mask;
}
for (int i = 1; i < a.length; i++) {
if (a[i] == null) {
a[i] = a[i-1];
}
}
}
}
并致电:
Utility<String> stringUtil = new Utility<>();
String[] theArray = {null, "one", "two", null, null, "four", "five", null};
stringUtil.coalesce(theArray, "N/A");
没有泛型:
public void coalesce(Object[] a, Object mask) {
if (a[0] == null) {
a[0] = mask;
}
for (int i = 1; i < a.length; i++) {
if (a[i] == null) {
a[i] = a[i-1];
}
}
}
对于可变类型,可以通过将T
更改为T extends Cloneable
然后在每个集合操作中调用.clone()
来改进第一种方法。此外,可以通过使用static
方法进一步改进第一种方法。
答案 1 :(得分:2)
为了实现您正在寻找的概括,您可能希望考虑Iterable
。通过这种方式,您可以对数组或集合执行此操作。
static class Coalesce<T> implements Iterable<T> {
final Iterable<T> feed;
public Coalesce(Iterable<T> feed) {
this.feed = feed;
}
@Override
public Iterator<T> iterator() {
return new ColascingIterator(feed.iterator());
}
private static class ColascingIterator<T> implements Iterator<T> {
// The Iterator we are feeding off.
final Iterator<T> it;
// The last non-null to replace nulls with.
T last = null;
public ColascingIterator(Iterator<T> it) {
this.it = it;
}
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public T next() {
T next = it.next();
// Return last if next is null.
return next == null ? last : (last = next);
}
}
}
public void test() {
List<String> test = Arrays.asList("Hello", null, "World");
for (String s : new Coalesce<>(test)) {
System.out.println(s);
}
}