我有一个从10到100的连续整数的数组列表。我生成一个随机数(比如说50)然后我想删除所有在10位置都有“5”的数字 - 所有整数从50到59 。
public static void updateMyGuess() {
ArrayList<Integer> possibles = new ArrayList <Integer>();
for (int i = 10; i < 100; i++) {
possibles.add(i);
}
int guess = 50; //my guess is generated by another method. Not listed here
int tens = guess / 10 % 10;
int x;
for ( int i = 0; i < possibles.size(); i++) {
x = possibles.get(i);
if (x / 10 % 10 == tens) {
possibles.remove(i);
}
}
出于某种原因,这只会删除50年代的ArrayList中的所有其他值:50,52,54 ...... 58.为什么会这样?我可以改变什么才能让它成为50年代的所有人?
答案 0 :(得分:3)
删除[i]
处的元素后,[i+1]
处的元素(以及之后的所有元素)向上移动一个空格。旧[i+1]
现在占据了[i]
处的元素,因此当i
递增时,您会跳过向上移动的元素。
答案 1 :(得分:2)
正如吉姆提到的那样,你正在改变列表,同时有效地跳过项目。
使用迭代器而不是for循环。迭代器是在遍历列表时删除元素的。
Iterator<Integer> iter = possibilities.iterator()
while (iter.hasNext()) {
x = iter.next();
if (x / 10 % 10 == tens) {
iter.remove();
}
}
答案 2 :(得分:2)
使用@nlloyd建议的Iterator
是一个更好的解决方案。
但是,可能会出现(无论出于何种原因)您无法使用Iterator
的情况(例如,您使用的是不提供迭代器的语言或库)。简单的解决方案是反向迭代:
for ( int i = possibles.size()-1; i >= 0; i--) {
如果您要立即再次删除项目,我们不清楚为什么您需要首先将项目添加到列表中:
ArrayList<Integer> possibles = new ArrayList <Integer>();
int guess = 50; //my guess is generated by another method. Not listed here
int tens = guess / 10 % 10;
for (int x = 10; x < 100; x++) {
if (x / 10 % 10 != tens) {
possibles.add(x);
}
}
答案 3 :(得分:2)
在java 8中,ArrayList也有一个remove if方法 for more examples on how to use removeIf
ArrayList<Integer> possibles = new ArrayList<Integer>();
for (int i = 10; i < 100; i++) {
possibles.add(i);
}
System.out.println(possibles);
int guess = 50; // my guess is generated by another method. Not listed
// here
int tens = guess / 10 % 10;
int x;
// removes all the elements for which removeIf returns true
possibles.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer arg0) {
return arg0 / 10 % 10 == tens;
}
});
System.out.println(possibles);