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

Java 删除不起作用的较短字符串,java,Java,编写一个方法removeShortStrings,该方法将ArrayList作为参数,并从每个连续的值对中删除该对中较短的字符串 例如,假设名为list的ArrayList包含以下值:{four”,“score”,“and”,“seven”,“year”,“ago”} 在第一对中,“四”和“分数”,较短的字符串是“四” 在第二对中,“和”以及“七个”,较短的字符串是“和” 在第三对中,“years”和“ago”,较短的字符串是“ago” 因此,调用:removeShortString(list)

编写一个方法
removeShortStrings
,该方法将
ArrayList
作为参数,并从每个连续的值对中删除该对中较短的字符串

例如,假设名为
list
ArrayList
包含以下值:
{four”,“score”,“and”,“seven”,“year”,“ago”}

在第一对中,
“四”和
“分数”
,较短的字符串是
“四”

在第二对中,
“和”
以及
“七个”
,较短的字符串是
“和”

在第三对中,
“years”
“ago”
,较短的字符串是
“ago”

因此,调用:
removeShortString(list)
应该删除这些较短的字符串,留下如下列表:
{“score”、“seven”、“year”}

如果存在平局(两个字符串具有相同的长度),则您的方法应删除该对中的第一个字符串。如果列表中有奇数个字符串,则最终值应保留在列表中

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);
            }
        }
    }
}
public void removeShortString(ArrayList a){
   

对于(int i=0;i您的测试
a.size()%2==0
是针对每一对进行的,这不是必需的。只需将其删除即可。

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

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

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)
        }
    }
}
public void removeShortString(ArrayList a){

对于(int i=0;i,您的问题是从列表中删除元素,但继续使用旧索引。克服此问题的最简单方法是向后遍历数组:

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);
        }
    }
}
public void removeShortString(ArrayList a){
对于(int i=a.size()/2-1;i>=0;i--){
字符串字=a.get(2*i);
stringword2=a.get(2*i+1);

如果(word.length()不能在for循环中更改列表,并在列表元素上迭代。(除非在删除元素后处理索引)

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

首先试着去理解它

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


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

注意您这里有一些主要问题

首先

公共静态void removeShortString(ArrayList ArrayList){
对于(int i=0;iif(arrayList.get(i).length(),除非您向后移动:)如果您通过
++i
更改
i+=2
并添加
否则{++i;}
您可以执行
a.remove(i)
。这正是“除非您在删除元素后处理当前索引”除非我向后移动?你的意思是在for循环中它应该是i--?它可以,或者在删除元素时减少i。@baraky是的,我在groovyConsole
RemoveShortString([“四”,“分数”,“和”,“七”,“年”,“年”,“以前])中运行过它你的循环体可以用一行来表达。你可以考虑编辑很多冗余代码,特别是为单词声明局部变量。@波希米亚我知道这是可以优化的,我想显示原始代码需要什么改变才能使它工作,而不是建立最佳的解决方案。“在java中做得好的技巧”不适合此网站。阅读编程入门或Java入门书籍(谷歌为好的一本)或更好地解释事情可能会有所帮助。你也可以在某处找到逻辑思维书籍或课程。阅读基本编程博客也可能会有所帮助。
for(int i=0;i<a.size()-1;i+=2){
if(a.size()%2==0 && word.length()<word2.length()){
       a.remove(i);
        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);
}
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++;
        }
    }
}