从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()); }