2013-10-18 36 views
5

我们给出一个ArrayList形式的单词列表如下:从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”的单词。请帮忙! (我的印象是,你开始时将它们从列表的末尾删除,因为它是从后到前排列的)

+0

你_remove_他们通过不添加他们到你返回的新列表。 –

+5

将'=='更改为'!=' – Cruncher

+1

向后也可以,但只能使用传统的'for'循环(for(int i = list.size-1; i> = 0; i--) '多种多样。然而,AbstractChaos的解决方案是首选的,但是 –

回答

7

您当前通过列表迭代的方式不会允许您将其移除但迭代器会。

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

你是对的,但是赋值指定使用一个简单的“for”循环,正如Richard Tingle在上面指定的那样:“向后也可以,但只有一个传统的for循环(for(int i = list.size-1; i> = 0; i--)变种。AbstractChaos的解决方案是pr但是 - “ – user2895102

+1

@ user2895102 - 您可以将上面的循环翻译为for循环:'for(Iterator it = list.iterator(); it.hasNext();)...' – DaoWen

1

你必须使用Iterator防止ConcurrentModificationException用来删除List值。

List<String> myList = getListOfStrings(); 
Iterator<String> it = myList.iterator(); 
while (it.hasNext()) { 
    if(it.next().length() == 3){ 
    it.remove(); 
    } 
} 
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删除时,都必须调整后备阵列的大小。

+0

这实际上比使用'Iterator'更快吗?我会以大约相同的速度与他们挂钩。 'Iterator'应该能够在一段时间内清除对吗?还是只有链接列表? – Cruncher

+0

@Cruncher这将是'LinkedList'。 'ArrayList $ Itr'调用'ArrayList#remove()'为底层数组做一个'System.arraycopy'。 –

+0

@SotiriosDelimanolis但是这不是你正在做的事情吗?将ArrayList减1会复制类似于System.arraycopy,除了你还实例化Deeper层次的类? – AbstractChaos

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 == lencomplement as false将照常运行。

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, .] 
0

斯卡拉你只是做

list.filter(_.length != len) 
+0

在[Clojure](http://clojure.org/)中,你只需要执行'(remove#(=(count%)len)my-list)' - 但是OP没有询问Scala或Clojure。但是,Java 8 _does_添加了一个Scala-esque'stream'包,这是我在答案中使用的。太糟糕了,我们不能期望人们实际上拥有另外一两年的Java 8 ... – DaoWen