2012-03-08 77 views
1

如果我有一个字节数组列表,我想,如果第一个索引是一个特定的值删除阵列中,我如何使用这样的:如何遍历字节数组列表...?

bytearrays.removeAll(Collections.singletonList(-7)); 

,如果这是不可能的,会是什么是最好的方式去做这件事?我试过使用迭代器,但我不认为我足够了解它们能够强制它检查阵列列表中每个数组的第一个索引...

当我简单地创建一个for循环,出于某种原因,某些数组不会被删除(通常是最后一个数组,有时最后2个取决于数组的数量)。

+1

你正在改变大小,当你从它删除的东西,但你不改变'大小' – 2012-03-08 10:31:30

回答

4

大多数列表都有一个迭代器,可以正确实现remove方法。

因为最简单的解决办法是类似以下内容:

final Iterator<byte[]> iter = bytearrays.iterator(); 
while (iter.hasNext()) { 
    final byte[] temp = iter.next(); 
    // TODO check for zero-length arrays 
    if (temp[0] == -7) { 
     iter.remove(); 
    } 
} 
+0

这个答案是很屁股。没有想到用户byte [] temp这种方式...非常整洁。谢啦。 +1和最佳答案 – BigBug 2012-03-08 10:32:59

2

您的主要问题是您从数组中的第一个循环到(last-2)元素,但是当您删除元素时,所有其他元素都会发生移位。相反,你应该以相反的顺序循环:

for(int z = bytearray.size() - 1; z >=0 ; z--) 
{ 
    byte[] temp = bytearrays.get(z); 
    if(temp[0] == -16 || temp[0] == -11 || temp[0] == -7) 
    { 
     bytearrays.remove(z); 
    } 
} 

我不知道为什么你不管其他条件去除数组的第一个元素,但是,您可以添加循环之前该行,如果你需要。

+0

+ 1的想法,谢谢:) – BigBug 2012-03-08 10:33:19

0

你不应该在迭代它,因为删除的条目从列表中删除导致列表改变 - 它改变的休息该列表,所以列表的大小也会发生变化。你最好使用一个迭代器来移除。无论如何,要注意的是,如果你用一个循环来迭代它的停止条件在列表的长度上,那么考虑它会改变。这也可以通过Iterator的hasNext()方法来解决。