Удаление незаполненных значений или нулевые значения из массива 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;
}