我需要一些帮助才能做到这一点,
问题 编写一个带2个数组的函数 - 一个数组是源数组,另一个数组是索引数组,删除源数组索引处的所有元素,从第二个数组中获取索引。
这就是我想出的......
public static int[] DeleteArrayUsingIndices(int[] source, int[] indices)
{
for (int i = 0; i < indices.Length; i++)
{
if (indices[i] < source.Length)
{
source[indices[i]] = int.MinValue; // delete
}
}
return source;
}
我不太确定这个解决方案,因为这不会删除该值。任何人都可以帮我解决这个问题。
答案 0 :(得分:2)
您无法真正删除数组中的元素,因此您需要询问此措辞的含义。如果用特殊元素(例如代码中的int.MinValue
)替换元素是可以接受的,那么您的解决方案就可以了。
另一种解释可能是重新排列数组,因此“未删除”索引处于数组的开头,其顺序与原始数据相同 - 在这种情况下,您希望返回新的“长度”数组(未被“删除”的元素数) - 这意味着“删除”操作会将尚未删除的元素数组压缩到数组的开头(将数组的内容向开头移动)从已删除的索引到数组的末尾(或到未删除元素的末尾)。必须注意不要两次“删除”相同的元素。
要实现后者,您必须跟踪移动了多少元素的位置。或者,更新索引数组以减小大于当前索引的索引(以适应现在压缩的数组) - 在这种情况下,您可以首先对索引数组进行排序(可能同时删除重复项),然后跟踪如何到目前为止,许多职位都已转移
答案 1 :(得分:1)
试试这个
public static void main(String[] args) {
Integer[] a = {1,2,3,4,5,6,7,8,9};
Integer[] b = {2,3};
System.out.println(Arrays.asList(deleteArrayUsingIndices(a, b)));
}
^用于测试
public static Integer[] deleteArrayUsingIndices(Integer[] source, Integer[] indices)
{
ArrayList<Integer> sourceArr = new ArrayList<Integer>(Arrays.asList(source));
ArrayList<Integer> toDelete = new ArrayList<Integer>();
for (int i:indices)
{
try {
toDelete.add(sourceArr.get(i));
} catch (Exception e) {}
}
sourceArr.removeAll(toDelete);
return sourceArr.toArray(new Integer[sourceArr.size()]);
}