如何解决如何将没有空值的元素移动到新数组
所以我想要做的是从数组中删除一个元素并将所有现有元素移动到一个没有空元素的新数组中。我已经将想要的元素设置为空。但是当我尝试使用此代码时,它只将第一个元素传输到数组中,其他元素都不会移动。我做错了什么?
旁注:我不允许使用 ArrayList。
Object[] temp = new Object[sList.length-1];
for (int j = 0; j < sList.length; j++){
if (sList[j] != null) {
temp[j] = sList[j];
}
}
解决方法
不要预先分配您的阵列。只需将非空值移动到数组的前面,保持顺序。
Integer[] array = {null,1,2,3,null,4,5,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
有没有空值的元素数。所以用它来创建一个新数组。
Integer[] result = Arrays.copyOf(array,i);
System.out.println("New Array: " + Arrays.toString(result));
印刷品
Before move: [null,6]
After move: [1,6,6]
New Array: [1,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;
}
}
Stream API 也可用于此任务(从技术上讲,此处不使用 ArrayList
:)):
Object[] temp = Arrays.stream(sList).filter(Objects::nonNull).toArray(Object[]::new);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。