-1

编写一个removeShorterStrings以 anArrayList<String>作为参数的方法,并从每对连续的值中删除该对中较短的字符串。

例如,假设一个ArrayList被调用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]而不是[score, seven, years].

有什么问题?

4

6 回答 6

3

由于您已经从列表中删除了您的项目,因此您只需要增加 1。而且由于您的比较对,您需要在循环中删除其中一个。

这个产生[分数,七,年]

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)
        }
    }
}
于 2013-04-07T13:45:58.493 回答
1

a.size()%2==0对每一对都进行了测试,这不是必需的。只需将其删除。

于 2013-04-07T13:44:33.990 回答
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);
        }
    }
}
于 2013-04-07T13:48:20.153 回答
1

您不能在迭代列表元素的 for 循环中更改列表。(除非您在删除元素后处理索引)

假设您删除第一个元素 (i=0),然后第二个元素(索引 1)成为第一个元素,依此类推。现在,当你增加 i 时,你会得到第二对,最初是第四和第五(而不是第三和第四)。

试着先理解它。

这就是为什么在迭代列表时不能更改列表(除非您使用Iterator

另一件事 - 你不需要检查 if a.size()%2==0。还有很多其他方法可以做到这一点。

于 2013-04-07T13:48:35.560 回答
0

注意你这里有主要问题

第一的

for(int i=0;i<a.size()-1;i+=2){

您从动态数组(ArrayList)中删除元素,并通过将 i 每次迭代递增 2 来处理它,就像它是静态数组一样,同时删除每个迭代 1 个元素,因此元素的索引减少 2。即在第一次迭代中,您的 i =0 并且你从 a 中删除“四”,所以现在 a 包含 [“score”、“and”、“seven”、“years”、“ago”],然后你使用 i=2 进行第二个循环,这使得 a .get(i) 向您返回“七”而不是“和”!,这很明显,因为现在您删除了 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);
}
于 2013-04-07T14:16:08.580 回答
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++;
        }
    }
}

输入:[“四”、“分数”、“和”、“七”、“年”、“以前”]

输出:[分数,七,年]

于 2020-02-10T09:07:13.463 回答