编写一个方法removeShorterStrings
,该方法将ArrayList<String>
作为参数,并从每个连续的值对中删除该对中较短的字符串。
例如,假设名为ArrayList
的{{1}}包含以下值:list
在第一对{"four", "score", "and", "seven", "years", "ago"}
和"four"
中,较短的字符串为"score"
。
在第二对"four"
和"and"
中,较短的字符串为"seven"
在第三对"and"
和"years"
中,较短的字符串为"ago"
。
因此,调用:"ago"
应删除这些较短的字符串,将列表保留如下:removeShorterStrings(list);
。
如果存在平局(两个字符串具有相同的长度),则您的方法应删除该对中的第一个字符串。如果列表中有奇数个字符串,则最终值应保留在列表中。
{"score", "seven", "years"}
要求public void removeShorterStrings(ArrayList <String> a){
for(int i=0;i<a.size()-1;i+=2){
String word=a.get(i);
String word2=a.get(i+1);
if(a.size()%2==0 && word.length()<word2.length()){
a.remove(i);
if(word.length()==word2.length()){
a.remove(i);
}
}
}
}
。
我的代码为我["four", "score", "and", "seven", "years", "ago"]
而不是[score, and, seven, years, ago]
。
有什么问题?
答案 0 :(得分:3)
由于您已经从列表中删除了项目,因此只需要增加一项。由于您的比较对,您需要在循环中删除其中一个。
这个产生[得分,七,年]
public void removeShorterStrings(ArrayList <String> a){
for(int i=0;i<a.size()-1;i++){
String word=a.get(i);
String word2=a.get(i+1);
if(word.length()<word2.length()){
a.remove(i);
} else {
a.remove(i+1)
}
}
}
答案 1 :(得分:1)
您的测试a.size()%2==0
已为每对完成,但这不是必需的。只需将其删除即可。
答案 2 :(得分:1)
您的问题是您从列表中删除元素,但继续使用旧索引。最简单的方法是向后遍历你的数组:
public void removeShorterStrings(ArrayList <String> a){
for(int i=a.size()/2-1; i>=0; i--){
String word=a.get(2*i);
String word2=a.get(2*i+1);
if(word.length()<=word2.length()){
a.remove(2*i);
} else {
a.remove(2*i+1);
}
}
}
答案 3 :(得分:1)
您无法在列表元素上迭代for循环内部更改列表。(除非您在删除元素后处理索引)
让我们说你删除第一个元素,(i = 0),然后第二个元素(索引1)成为第一个元素,依此类推。 现在,当你增加i时,你会进入第二对,最初是第四对和第五对(而不是第三对和第四对)。
首先尝试理解它。
这就是为什么在迭代时不能更改列表的原因(除非你使用Iterator
)
另一件事 - 你不需要检查是否a.size()%2==0
。还有很多其他方法可以做到。
答案 4 :(得分:0)
请注意这里有主要问题
第一
for(int i=0;i<a.size()-1;i+=2){
从动态数组(ArrayList)中删除元素,并将它作为静态处理,就像将每次迭代递增2一样,同时删除每个迭代1元素,使元素索引减少2。 即在第一次迭代中你的i = 0并从a中删除“4”,所以现在包含[“得分”,“和”,“七”,“年”,“前”],然后你去第二次循环i = 2这使得a.get(i)返回“seven”而不是“和”给你! ,这很明显,因为现在你删除了1个元素,而esch元素现在有了index = oldIndex-1。
第二
if(a.size()%2==0 && word.length()<word2.length()){
a.remove(i);
if(word.length()==word2.length()){
a.remove(i);
}
}
你在这个if块中输入了完全错误的条件,这实际上是你在这里做的主要工作,由于这些条件,现在永远不能正确完成。
1 - a.size()%2==0
仅在第一个循环中评估为真,因为大小是偶数,在第一个循环之后,你将使这个偶数大小减少1变为奇数。
2 - word.length()<word2.length()
一旦两个单词的长度相等,这将给出错误!!实际上你永远不会遇到这种情况if(word.length()==word2.length()){
a.remove(i);
}
正确的代码应该是
for(int i=0;i<a.size()-1;i++){
String word=a.get(i);
String word2=a.get(i+1);
if(word.length()<=word2.length()){
a.remove(i);
}
else
a.remove(i+1);
}
答案 5 :(得分:0)
public static void removeShorterStrings(ArrayList<String> arrayList){
for(int i = 0; i < arrayList.size()-1; i++){
if(arrayList.get(i).length() <= arrayList.get(i + 1).length()){
arrayList.remove(i);
}
else{
arrayList.remove(i + 1);
i++;
}
}
}
输入:[“四个”,“得分”,“和”,“七个”,“年”,“前”]
输出:[分数,七年,年]