5

我们得到一个 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;
    }

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

我已经写了一个方法,列出了用户输入的所有长度为“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”的单词上。请帮忙!(我的印象是您首先从列表的末尾删除它们,就像从后到前一样)

4

6 回答 6

7

您当前遍历列表的方式不允许您在异常情况下将其删除,但迭代器会。

Iterator<String> it = list.iterator();
while(it.hasNext()) {
 if([Condition]) {
   it.remove();
  }
}
于 2013-10-18T14:14:15.803 回答
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,都必须调整后备数组的大小。

于 2013-10-18T14:20:38.993 回答
1

List您必须使用a 从 a 中删除值Iterator以防止 a ConcurrentModificationException

List<String> myList = getListOfStrings();
Iterator<String> it = myList.iterator();
while (it.hasNext()) {
   if(it.next().length() == 3){
    it.remove();
   }
}
于 2013-10-18T14:18:01.043 回答
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);

}

如果你传入complementas true,if 会给你所有没有的东西length == lencomplement就像false往常一样。

于 2013-10-18T14:23:39.067 回答
0

在 Scala 中你会做

list.filter(_.length != len)
于 2013-10-18T15:29:36.543 回答
0

虽然我认为@SotiriosDelimanolis 的答案可能是您应该使用的,但我还想指出,使用 Java 8,您可以使用 aStream和 a轻松完成此操作Predicate

 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, .]
于 2013-10-18T15:27:03.527 回答