1

编写一个方法 removeEvenLength,它以字符串的 ArrayList 作为参数,并从列表中删除所有偶数长度的字符串。

public void removeEvenLength(ArrayList <String> stringList){
    for(int i=0;i<stringList.size();i++){
        String word=stringList.get(i);
        if(word.length()%2==0){//even
            stringList.remove(word);//if it is even,test from the first word  then continue looping


        }


    }
}

当我尝试传入 ["This", "is", "a", "test"] 时,它应该返回我 a。但它给我的是,a。它有什么问题?

4

7 回答 7

6

提示:您正在迭代期间从列表中删除当前项目。想想这可能对随后的迭代产生什么影响。

于 2013-04-06T17:30:32.280 回答
1

在循环遍历列表时从列表中删除项目时使用迭代器。它会为你处理这个问题。

public void removeEvenLength( List<String> stringList ) {
    Iterator<String> iterator = stringList.iterator();
    while( iterator.hasNext() ) {
        final String word = iterator.next();
        if( word.length() % 2 == 0 ) {
            iterator.remove();
        }
    }
}

更好的方法是创建一个包含所有奇数长度值的新列表。这样您就不会修改原始列表。一般来说,没有副作用的功能越多越好。

public List<String> removeEvenLength( List<String> stringList ) {
    List<String> oddList = new ArrayList<String>();
    for( String word : stringList ) {
        if( word.length % 2 == 1 ) {
            oddList.add( word );
        }
    }
    return oddList;
}
于 2013-04-06T17:43:20.533 回答
1

这些答案似乎都那么复杂……

每当您需要修改列表中的元素数量时,为了避免影响尚未测试的元素的索引,您应该反向遍历列表。

    public static void removeEvenLength(ArrayList<String> arr){
        for(int i=arr.size()-1; i>=0; i--)
            if(arr.get(i).length() % 2 == 0)
                arr.remove(i);
    }

无需创建列表的副本,或以任何方式更改 for 循环计数器。

于 2021-08-26T07:22:49.447 回答
0

你能试试下面的吗?这个对我有用

import java.util.*;

class Fun
{
    public static void removeEvenLength(ArrayList <String> stringList){
        for(int i=0;i<stringList.size();i++){
            String word=stringList.get(i);
            if(word.length()%2==0){//even
                stringList.remove(word);//if it is
                i = i-1;
                continue;
            }
        }

        for(int i=0;i<stringList.size();i++){
            String word=stringList.get(i);
            System.out.println(word);
        }
    }

public static void main(String []args)
{
    ArrayList <String> stringList = new ArrayList <String>();
    stringList.add("this");
    stringList.add("is");
    stringList.add("a");
    stringList.add("test");
    removeEvenLength(stringList);
}

}

于 2013-04-06T17:40:06.897 回答
0

这是我这样做的方式:)

public static void removeEvenLength(ArrayList<String> l){

    ArrayList<String> temp = new ArrayList<>();
    for(String word : l){

        if(word.length()%2==0){temp.add(word);}

    }

    l.removeAll(temp);
    


}
于 2020-05-22T03:51:21.020 回答
0

在 Java 8 中,您可以使用 removeIf(predicate) 从 Collection 中删除元素,而无需手动创建 Iterator:

Set<String> set = new HashSet<String>(Arrays.asList("1234","wsxw","qaz","qwertyui","q","qwe","qwerty","qwqw"));
set.removeIf(p -> p.length() %2 == 0);

于 2020-04-09T17:51:03.583 回答
-1
public static void removeEvenLength(ArrayList <String> stringList){
        for(int i=0;i<stringList.size();i++){
            String word=stringList.get(i);
            System.out.println(word+" "+word.length()+" "+word.length()%2);
            if(word.length()%2==0){//even
                System.out.println("Rmoving "+word);
                stringList.remove(word);
                removeEvenLength(stringList);//Recursive call
            }
        }
    }

使用递归调用函数。

于 2013-04-06T17:39:12.407 回答