我们给出了一个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”的单词。请帮忙! (我的印象是你开始将它们从列表末尾删除,然后回到原地)
答案 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)
您必须使用List
从Iterator
中删除值,以阻止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,您可以使用Stream
和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, .]
答案 5 :(得分:0)
list.filter(_.length != len)