从Java中的String数组中删除未填充的值或空值
我在执行操作后跟随字符串数组tmp = [null, null, null, Mars, Saturn, Mars]
– allSig[d3].split(" ");
其中allSig
是一个字符串数组。 null值是数组中的空值。 现在我想删除null。 为此,我正在使用
tmp[indexNumber] != null
不起作用并给出true; 取null作为值。 即使我使用“null”作为字符串不起作用。
如何删除它。
public static String[] removeElements(String[] allElements) { String[] _localAllElements = new String[allElements.length]; for (int i = 0; i < allElements.length; i++) if (allElements[i] != null) _localAllElements[i] = allElements[i]; return _localAllElements; }
public static String[] clean(final String[] v) { int r, w; final int n = r = w = v.length; while (r > 0) { final String s = v[--r]; if (!s.equals("null")) { v[--w] = s; } } return Arrays.copyOfRange(v, w, n); }
要么
public static String[] clean(final String[] v) { int r, w, n = r = w = v.length; while (r > 0) { final String s = v[--r]; if (!s.equals("null")) { v[--w] = s; } } final String[] c = new String[n -= w]; System.arraycopy(v, w, c, 0, n); return c; }
工作良好…
public static void main(final String[] argv) { final String[] source = new String[] { "Mars", "null", "Saturn", "null", "Mars" }; assert Arrays.equals(clean(source), new String[] { "Mars", "Saturn", "Mars" }); }
最简单的解决方案
public static String[] clean(final String[] v) { List list = new ArrayList (Arrays.asList(v)); list.removeAll(Collections.singleton(null)); return list.toArray(new String[list.size()]); }
您正在创建一个与原始数组大小相同的数组。 因此,它与原始数组相同,因为您复制非空值并且默认值为null。
做这个 :
public static String[] removeElements(String[] allElements) { // 1 : count int n = 0; for (int i = 0; i < allElements.length; i++) if (allElements[i] != null) n++; // 2 : allocate new array String[] _localAllElements = new String[n]; // 3 : copy not null elements int j = 0; for (int i = 0; i < allElements.length; i++) if (allElements[i] != null) _localAllElements[j++] = allElements[i]; return _localAllElements; }
摘要@az答案,这适用于任何类类型:
@SuppressWarnings("unchecked") public static T[] clean(T[] a) { List list = new ArrayList (Arrays.asList(a)); list.removeAll(Collections.singleton(null)); return list.toArray((T[]) Array.newInstance(a.getClass().getComponentType(), list.size())); }
如果你想让数组只包含非空值(即生成的数组将是["Mars", "Saturn", "Mars"]
),那么我会将此视为两部分问题。
首先,您必须确定新arrays的大小。 从检查中,很容易看出它是3
,但你需要计算它们以编程方式计算它。 你可以这样说:
// Calculate the size for the new array. int newSize = 0; for (int i = 0; i < allElements.length; i++) { if (allElements[i] != null) { newSize++; } }
其次,您需要创建一个具有该大小的新数组。 然后,您可以将所有非null元素放入新数组中,如上所述。
// Populate the new array. String[] _localAllElements = new String[newSize]; int newIndex = 0; for (int i = 0; i < allElements.length; i++) { if (allElements[i] != null) { _localAllElements[newIndex] = allElements[i]; newIndex++; } } // Return the new array. return _localAllElements;
您可以将这两个组件组合为results
方法的新内容。 请在此处查看完整的组合代码和实时示例输出。
public static String[] removeElements(String[] allElements) { String[] _localAllElements = new String[allElements.length]; int j = 0; for (int i = 0; i < allElements.length; i++) if ( allElements[i] != null && !allElements[i].equals("")) _localAllElements[j++] = allElements[i]; return _localAllElements; }
这是一个非常古老的问题,但这个Java 8+解决方案可能对某些人有用:
public static String[] removeElements(String[] allElements) { return Arrays.stream(allElements) .filter(Objects::nonNull) .collect(Collectors.toArray()); }
或者,如果你像我一样,是可读代码的粉丝,并且不希望静态方法妨碍你,你可以使用静态导入进一步简化:
public static String[] removeElements(String[] allElements) { return stream(allElements).filter(Objects::nonNull).collect(toArray()); }