Java 为什么我的IF可以';我的ArrayList&x27;s索引?

Java 为什么我的IF可以';我的ArrayList&x27;s索引?,java,arrays,Java,Arrays,我的想法是检查ArrayList中的元素是以A、B、C开头,还是以另一个字母开头,但由于某些原因,我的IF无法获取一些单词,例如“Almofada” 您的问题在于for循环。在循环的每次迭代中增加索引“i”,然后删除单词(i)处的单词。因为我会增加,但单词列表的大小在每次迭代中都会减小,“i”会快速增加到单词列表的新大小,而不会实际计算最后的字符串 要更正,只需避免在每次迭代中增加i: for(int i = 0; i < words.size();){ //Notice i is not

我的想法是检查ArrayList中的元素是以A、B、C开头,还是以另一个字母开头,但由于某些原因,我的IF无法获取一些单词,例如“Almofada”


您的问题在于for循环。在循环的每次迭代中增加索引“i”,然后删除
单词(i)处的单词。
因为我会增加,但单词列表的大小在每次迭代中都会减小,“i”会快速增加到单词列表的新大小,而不会实际计算最后的字符串

要更正,只需避免在每次迭代中增加i:

for(int i = 0; i < words.size();){ //Notice i is not being incremented (i++)
    char firstChar = words.get(i).charAt(0);
    if(firstChar == 'A'||firstChar == 'B'||firstChar == 'C'){
        abc.add(words.get(i));
    }else{
        rest.add(words.get(i));
    }
    words.remove(words.get(i));
}
for(inti=0;i
问题是因为从ArrayList中删除了单词,
单词
。删除行,
words.Remove(words.get(i))
以获得所需的输出

按如下方式操作:

import java.util.ArrayList;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>(
                Arrays.asList("Canivete", "Almofada", "Corda", "Parede", "Caixa", "Zilhão", "Dedo"));
        ArrayList abc = new ArrayList<>();
        ArrayList rest = new ArrayList<>();

        for (int i = 0; i < words.size(); i++) {
            char firstChar = words.get(i).charAt(0);
            if (firstChar == 'A' || firstChar == 'B' || firstChar == 'C') {
                abc.add(words.get(i));
            } else {
                rest.add(words.get(i));
            }
        }
        System.out.println("Start with A,B or C: " + abc);
        System.out.println("Start with other letters: " + rest);
        System.out.println("Original array: " + words);
    }
}

一旦从ArrayList中删除了一个元素,被删除元素右侧的所有元素都将移到一个元素的左侧。

例如,如果您有一个数组列表
A=[1,2,3,4]
并且执行
A.remove(0)
,那么结果数组列表将不是
A=[null,2,3,4]
,而是
A=[1,2,4]

程序的问题在于未能处理
remove()
函数的这种行为

你怎么处理? 只需更改for循环的退出条件。在您的情况下,始终检查第一个元素,并在ArrayList清空后退出,然后
words.size()==0
。您不需要增加
i


解决方案
跳过元素是因为按位置删除元素,但这样做时不会后退。这就是为什么您应该使用
words.iterator()
;非常感谢大家,我很感激所有的答案!!
for(int i = 0; i < words.size();){ //Notice i is not being incremented (i++)
    char firstChar = words.get(i).charAt(0);
    if(firstChar == 'A'||firstChar == 'B'||firstChar == 'C'){
        abc.add(words.get(i));
    }else{
        rest.add(words.get(i));
    }
    words.remove(words.get(i));
}
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>(
                Arrays.asList("Canivete", "Almofada", "Corda", "Parede", "Caixa", "Zilhão", "Dedo"));
        ArrayList abc = new ArrayList<>();
        ArrayList rest = new ArrayList<>();

        for (int i = 0; i < words.size(); i++) {
            char firstChar = words.get(i).charAt(0);
            if (firstChar == 'A' || firstChar == 'B' || firstChar == 'C') {
                abc.add(words.get(i));
            } else {
                rest.add(words.get(i));
            }
        }
        System.out.println("Start with A,B or C: " + abc);
        System.out.println("Start with other letters: " + rest);
        System.out.println("Original array: " + words);
    }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>(
                Arrays.asList("Canivete", "Almofada", "Corda", "Parede", "Caixa", "Zilhão", "Dedo"));
        List<String> abc = words.stream().filter(s -> s.startsWith("A") || s.startsWith("B") || s.startsWith("C"))
                .collect(Collectors.toList());
        List<String> rest = words.stream().filter(s -> !(s.startsWith("A") || s.startsWith("B") || s.startsWith("C")))
                .collect(Collectors.toList());
        System.out.println("Start with A,B or C: " + abc);
        System.out.println("Start with other letters: " + rest);
        System.out.println("Original array: " + words);
    }
}
Start with A,B or C: [Canivete, Almofada, Corda, Caixa]
Start with other letters: [Parede, Zilhão, Dedo]
Original array: [Canivete, Almofada, Corda, Parede, Caixa, Zilhão, Dedo]
public static void main(String[] args) {
    //arraylist pra verificar quais strings começam com a,b,c
    ArrayList<String> words = new ArrayList<>(
            Arrays.asList(
                    "Canivete",
                    "Almofada",
                    "Corda",
                    "Parede",
                    "Caixa",
                    "Zilhão",
                    "Dedo"
            ));

    System.out.println("Original array: " + words + "\n");

    ArrayList<String> abc = new ArrayList<>();
    ArrayList<String> rest = new ArrayList<>();

    for (int i = 0; words.size() > 0;) {
        char firstChar = words.get(i).charAt(0);
        if (firstChar == 'A' || firstChar == 'B' || firstChar == 'C') {
            abc.add(words.get(i));
        } else {
            rest.add(words.get(i));
        }
        words.remove(words.get(i));
    }
    System.out.println("Start with A,B or C: " + abc);
    System.out.println("Start with other letters: " + rest);
}
Original array: [Canivete, Almofada, Corda, Parede, Caixa, Zilhão, Dedo]

Start with A,B or C: [Canivete, Almofada, Corda, Caixa]
Start with other letters: [Parede, Zilhão, Dedo]