所以我要做的是从数组中删除和元素,并将所有现有元素移动到没有null元素的新数组中。我已经将想要的元素设置为null。但是,当我尝试使用此代码时,它只将第一个元素转移到数组中,其他元素都不会移动。我做错了什么?
附带说明:我不允许使用ArrayList。
Object[] temp = new Object[sList.length-1];
for (int j = 0; j < sList.length; j++){
if (sList[j] != null) {
temp[j] = sList[j];
}
}
不要预先分配数组。只需将非null值移动到数组的前面,即可保持顺序。
Integer[] array = {null,1,2,3,null, 4,5,null, 6};
System.out.println("Before move: " + Arrays.toString(array));
int i = 0;
for (int k = 0; k < array.length; k++) {
if (array[k] == null) {
continue;
}
array[i++] = array[k];
}
System.out.println("After move: " + Arrays.toString(array));
现在i
具有没有null的元素的数量。所以用它来创建一个新的数组。
Integer[] result = Arrays.copyOf(array,i);
System.out.println("New Array: " + Arrays.toString(result));
打印
Before move: [null, 1, 2, 3, null, 4, 5, null, 6]
After move: [1, 2, 3, 4, 5, 6, 5, null, 6]
New Array: [1, 2, 3, 4, 5, 6]
如果你不被允许使用Arrays.copy()
,你可以这样做。
Integer[] result = new Integer[i];
for (int k = 0; k < i; k++) {
result[k] = array[k];
}
注意:我没有包括其他更简单的方法(例如流、集合(,因为如果你不能使用ArrayList
等,你可能也不应该使用其他更高级的方法。
使用List<Object>
创建目标Array
。
List<Object> result = new ArrayList<>();
for (int j = 0; j < sList.length; j++){
if (sList[j] != null) {
result.add(sList[j]);
}
}
Object[] temp = result.toArray();
更通用的解决方案是首先计算源阵列中null
的数量:
int nullCount = 0;
for (int i = 0; i < sList.length; i++) {
if (null == sList[i]) {
nullCount++;
}
}
Object[] temp = new Object[sList.length - nullCount];
for (int i = 0, j = 0; i < sList.length; i++) {
Object obj = sList[i];
if (null != obj) {
temp[j++] = obj;
}
}
流API也可用于此任务(从技术上讲,此处不使用ArrayList
:(:
Object[] temp = Arrays.stream(sList).filter(Objects::nonNull).toArray(Object[]::new);