例如:
int[] nums = {11,12,13,14,15,16};
int[] position = {1,2};
因此,在这里我想删除多个元素,例如,我想同时删除索引1和2:当我调用delete方法时。
public int[] delete(int[] source, int[] position) {
// How do I implement this?
}
//Main Class
public static void main(String[] args){
int[] newArray = delete(nums, position);
}
那么,我该如何解决这个问题?????我已经尝试了很多次,但无法映射位置和数组值。因此,删除两个值确实很困难。
也许使用ArrayList并将数组转换为Integer而不是基元int更容易。
- 这里的第一个问题是在
delete
函数的position[]
参数中:你可以得到一个IndexOutOfBoundsException
,因为任何调用该函数的人都可以传递一个位置列表,这些位置不能在数组num[]中
例如:
num[]
数组大小为4,有人经过位置{1,6},在这种情况下,num[](中不存在第6个索引
- 第二个问题是确保删除正确的索引
例如,如果num{34,53,33,64}和表示要删除的索引的位置{0,1},您会期望数字34和53被删除,但随着0索引的删除,53将变为0索引,而不是以前的索引1。
所以这里的解决方法是反转排序位置,这样可以防止这个问题。
下面是一个示例代码,用于说明删除功能:
Integer num[]... //Using Integer instead of int will be use to remove items using ArrayList
public void delete(Integer[] position){ //position[] being Integer instead of int will be easier to rever sorting
//
//Reversing order of position[] to prevent problem 2
Arrays.sort(position, Collections.reverseOrder());
//
ArrayList<Integer> objArrayListMyNumbers = Array.asList(num);
//
// Iterate through every element of position
for(Integer i : position){
//
//It's better surround by try and catch, because of the problem 1 (IndexOutOfBoundsException)
try{
objArrayListMyNumbers.remove(i);
}
catch(IndexOutOfBoundsException e){
e.printStack();
}
}
//
//Gets a new Array with items removed
num = new Integer(objArrayListMyNumbers.size());
num = objArrayListMyNumbers.toArray();
}
您正在寻找这样的方法吗?Java数组不能调整大小,必须创建一个新数组。
public static int[] delete(int[] source, int[] position) {
Arrays.sort(position);
int positionIdx = 0;
int[] newArray = new int[source.length - position.length];
for (int i = 0; i < source.length; i++) {
if (positionIdx < position.length && i == position[positionIdx]) {
positionIdx++;
} else {
newArray[i - positionIdx] = source[i];
}
}
return newArray;
}
用法:
public static void main(String[] args) {
int[] nums = {11, 12, 13, 14, 15, 16};
int[] position = {1, 2};
System.out.println(Arrays.toString(delete(nums, position)));
}
可能有一个基于过滤流的解决方案:
static int[] deleteAtPositions(int[] nums, int[] positions) {
Set<Integer> idx = Arrays.stream(positions).boxed().collect(Collectors.toSet());
return IntStream.range(0, nums.length)
.filter(i -> !idx.contains(i)) // no need to check for bounds
.map(i -> nums[i])
.toArray();
}
int[] nums = {11,12,13,14,15,16};
int[] positions = {1,2};
System.out.println(Arrays.toString(deleteAtPositions(nums, positions)));
输出:
[11, 14, 15, 16]