删除较短的字符串不起作用

时间:2013-04-07 13:38:10

标签: java

编写一个方法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]

有什么问题?

6 个答案:

答案 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++;
        }
    }
}

输入:[“四个”,“得分”,“和”,“七个”,“年”,“前”]

输出:[分数,七年,年]