我在数组的帮助下为整数实现我的自定义ArrayList类,我希望能够从我的数组中删除某个值。我的问题是当彼此旁边有许多相同的可删除值时,我得到两个0彼此相邻导致一个错误。我试图解决它几个小时没有运气。这是我的代码:
[4, 2, 3, 4, 4, 4, 4, 1, 2, 3]
在删除值(4)之前,我的数组看起来像这样:
[2, 3, 0, 0, 4, 4, 4, 1, 2, 3]
运行代码后,这是错误的结果:
[2, 3, 1, 2, 3, 0, 0, 0, 0, 0]
我想要实现的目标:StaticGridLayoutManager
我的问题是:使用尽可能少的循环来使代码工作的最佳方法是什么?
答案 0 :(得分:0)
您的代码中的一个问题是,您始终将索引tempIndex+1
处的元素复制到tempIndex
:它始终是下一个元素。
事实上,在删除了我们之后说出数组中的5
个元素后,您必须将tempIndex+5
复制到tempIndex
。
我认为这是一个很好的方法:
public void deleteValues(int[] a, int value) {
int j=0;
for(int i=0; i<a.length; i++) {
if(a[i]!=value) {
a[j] = a[i];
j++;
}
}
// fill the rest of the array with zeros
while(j<a.length) {
a[j] = 0;
j++;
}
}
基本上,您保留两个索引:i
和j
。
索引i
遵循&#34;原始&#34;数组,而索引j
跟随&#34; new&#34;数组(删除后)。
索引i
遍历所有元素:如果a[i]
不等于value
,请将其复制到新位置j
并递增j
{1}}和i
。如果a[i]
等于value
,请跳过它并递增i
而不增加j
。
复制或跳过所有元素后,用零填充数组的末尾。
示例输入:
a = {4, 2, 3, 4, 4, 4, 4, 1, 2, 3}
value = 4
输出:
a = {2, 3, 1, 2, 3, 0, 0, 0, 0, 0}
答案 1 :(得分:0)
public static void deleteValues(int[] a, int value) {
int newSize = a.length;
int current = 0;
for (int i = 0; i < a.length; i++) {
if (a[i] != value) {
if (i != current) {
a[current] = a[i];
newSize--;
}
current++;
}
}
//use first newSize values, for example you can copy to new array
System.out.println("New size = " + newSize);
}
答案 2 :(得分:0)
你可以使用迭代器:
List<Integer> numbers = ....
Iterator<Integer> i = numbers.iterator();
while (i.hasNext()) {
Integer num = i.next();
// add here your custom code
i.remove();
}
答案 3 :(得分:0)
int tempIndex,index;
for (index = 0, tempIndex = 0; index < valuesArray.length; index++) {
if (valuesArray[index] != valToDelete) {
valuesArray[tempIndex++]=valuesArray[index];
}
}
while(tempIndex<valuesArray.length){
valuesArray[tempIndex++]=0;
}