Удаление незаполненных значений или нулевые значения из массива String в Java

У меня есть следующий String Array  tmp = [null, null, null, Mars, Saturn, Mars] после выполнения операции - allSig[d3].split(" "); где allSig - массив строк. Пустое значение - это пустое значение в массиве. Теперь я хочу удалить нуль. Для этого я использую

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;
}

Ответ 1

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" });
}

Ответ 2

Простейшее решение:

 public static String[] clean(final String[] v) {
    List<String> list = new ArrayList<String>(Arrays.asList(v));
    list.removeAll(Collections.singleton(null));
    return list.toArray(new String[list.size()]);
}

Ответ 3

Вы создаете массив с тем же размером, что и исходный. Таким образом, это то же самое, что и исходный массив, поскольку вы копируете не нулевые значения и значения по умолчанию равны нулю.

Сделайте это:

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;
}

Ответ 4

Тезисы @az отвечают, это относится к любому типу класса:

@SuppressWarnings("unchecked")
public static <T> T[] clean(T[] a) {
    List<T> list = new ArrayList<T>(Arrays.asList(a));
    list.removeAll(Collections.singleton(null));
    return list.toArray((T[]) Array.newInstance(a.getClass().getComponentType(), list.size()));
}

Ответ 5

Если вы хотите, чтобы массив содержал только ненулевые значения (т.е. результирующий массив был бы ["Mars", "Saturn", "Mars"]), тогда я рассматривал бы это как проблему с двумя частями.

Сначала вы должны определить, какой должен быть размер нового массива. Из проверки легко видеть, что это 3, но вам нужно будет подсчитать их, чтобы вычислить это программно. Вы можете сделать это, сказав:

// Calculate the size for the new array.
int newSize = 0;
for (int i = 0; i < allElements.length; i++)    {
    if (allElements[i] != null) {
        newSize++;
    }
}

Во-вторых, вам нужно будет создать новый массив с таким размером. Затем вы можете поместить все ненулевые элементы в ваш новый массив, как вы это делали выше.

// 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. См. Полный комбинированный код и живой образ вывода здесь.

Ответ 6

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;
}