For Loop在搜索ArrayList时跳过每隔一行

时间:2016-02-06 02:56:26

标签: java for-loop arraylist

我有一个从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年代的所有人?

4 个答案:

答案 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);