Java 为什么我的IF可以';我的ArrayList&x27;s索引?
我的想法是检查ArrayList中的元素是以A、B、C开头,还是以另一个字母开头,但由于某些原因,我的IF无法获取一些单词,例如“Almofada”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
您的问题在于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]