从ArrayList中删除给定长度的字符串?

时间:2013-10-18 14:12:06

标签: java arraylist bluej

我们给出了一个ArrayList形式的单词列表,如下所示:

 public ArrayList<String> getListOfStrings(){
     ArrayList<String> list = new ArrayList<String>();
     list.add("This");
     list.add("is");
     list.add("an");
     list.add("exercise");
     list.add("to");
     list.add("illustrate");
     list.add("the");
     list.add("use");        
     list.add("of");
     list.add("ArrayLists");        
     list.add(".");
     return list;
    }

如何编写一个方法来删除用户输入长度为“len”的列表中的所有单词(即ArrayList中的所有对象)?

我已经编写了一个方法,列出了用户输入的所有长度为“len”的单词,并且它有效,如下所示:

public ArrayList<String>getWordsWithLength(int len, ArrayList<String> lijst){
    ArrayList<String> list = new ArrayList<String>();
    for(String woord: lijst){
        if(woord.length()==len){
            list.add(woord);
        }
    }
    return(list);

}

但作为java的初学者,我一直坚持如何删除长度为“len”的单词。请帮忙! (我的印象是你开始将它们从列表末尾删除,然后回到原地)

6 个答案:

答案 0 :(得分:7)

您当前迭代列表的方式不允许您使用异常删除它,但迭代器会这样做。

Iterator<String> it = list.iterator();
while(it.hasNext()) {
 if([Condition]) {
   it.remove();
  }
}

答案 1 :(得分:4)

您的方法已经可以作为删除,只需将==更改为!=

public ArrayList<String> getStringsWithoutEqualLength(int len, ArrayList<String> lijst){
    ArrayList<String> list = new ArrayList<String>();
    for(String woord: lijst){
        if(woord.length() != len){ 
            list.add(woord);
        }
    }
    return(list);
}

如果您要尝试删除lijst中的元素,则只需将返回的列表重新分配给它。

ArrayList<String> yourList = ...;
yourList = instance.getStringsWithoutEqualLength(someLength, yourList);

您已经有效地删除了较长的元素,并且比使用Iterator 更快地完成了它。每次使用Iterator删除时,都必须调整后备阵列的大小。

答案 2 :(得分:1)

您必须使用ListIterator中删除值,以阻止ConcurrentModificationException

List<String> myList = getListOfStrings();
Iterator<String> it = myList.iterator();
while (it.hasNext()) {
   if(it.next().length() == 3){
    it.remove();
   }
}

答案 3 :(得分:0)

您甚至可以通过添加布尔参数来使用相同的方法。

public ArrayList<String>getWordsWithLength(int len, ArrayList<String> lijst, boolean complement){
    ArrayList<String> list = new ArrayList<String>();
    for(String woord: lijst){
        if((woord.length()==len) != complement){
            list.add(woord);
        }
    }
    return(list);

}

如果您将complement作为true传递,那么将为您提供没有length == len的所有内容。 complement false将像往常一样。

答案 4 :(得分:0)

虽然我认为@ SotiriosDelimanolis的回答可能就是您应该使用的,但我还想指出,使用Java 8,您可以使用StreamPredicate来轻松完成此操作:

 List<String> list2 = list.stream()
                      .filter(s -> s.length() != 3)
                      .collect(Collectors.toList());

这是一个完整的测试类:

import java.util.*;
import java.util.stream.*;

class Test {
  public static void main(String args[]) {
     ArrayList<String> list = new ArrayList<String>();
     list.add("This");
     list.add("is");
     list.add("an");
     list.add("exercise");
     list.add("to");
     list.add("illustrate");
     list.add("the");
     list.add("use");
     list.add("of");
     list.add("ArrayLists");
     list.add(".");
     System.out.println(list);
     List<String> list2 = list.stream()
                          .filter(s -> s.length() != 3)
                          .collect(Collectors.toList());
     System.out.println(list2);
  }
}

和我的测试输出:

$ java Test
[This, is, an, exercise, to, illustrate, the, use, of, ArrayLists, .]
[This, is, an, exercise, to, illustrate, of, ArrayLists, .]

答案 5 :(得分:0)

在Scala中你只是做

list.filter(_.length != len)