2011-12-01 81 views
0

我想從一個集合中刪除長度爲5的字符串,但它不斷輸出集合本身。如何從一組中刪除長度爲5的字符串?

public void remove5() 
{ 
Set<String> newSet = new HashSet<String>(); 
newSet.add("hello"); 
newSet.add("my"); 
newSet.add("name"); 
newSet.add("is"); 
newSet.add("nonsense"); 
for(String word: newSet) 
{ 
    if(word.length()==5) 
    { 
     newSet.remove(word); // Doesn't Help - throws an error Exception in thread "main" java.util.ConcurrentModificationException 
    } 
} 
    System.out.println(newSet); 
} 

我所要的輸出是:

my 
name 
is 
nonsense 

(除去你好,因爲它是5個字符)

但我得到這個每次:

hello 
my 
name 
is 
nonsense 

可以請你幫幫我?

+0

而不是刪除舊的代碼,翻了你有INT無前提的推斷的有用的答案的,我認爲它會更好,在你的問題的末尾添加新的代碼,或者甚至要求新題。 –

回答

2
Iterator<String> it= newStr.iterator(); 
while(it.hasNext()) { // iterate 
    String word = it.next(); 
    if(word.length() == 5) { // predicate 
     it.remove(); // remove from set through iterator - action 
    } 
} 
+0

你能解釋爲什麼String [] setStr = set1.toArray(new String [0]);需要嗎?爲什麼我不能迭代一個集合?你的方法有效。 –

+0

爲什麼要創建一個新的String []?爲什麼不使用迭代器? – mprabhat

+0

@MacosxIam:避免併發修改異常。但你可以直接從迭代器實例中刪除元素 –

0

字符串是immutable,爲String word或其他任何字符串所做的更改不會的Set

字符串中反映添加

if(word.length()==5) 
    { 
     word.replaceAll(word, ""); 
     newSet.remove(word); 
    } 

你可以參考HashSet的

remove(Object o) 
的這個功能

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html

+0

那麼我該如何修改字符串呢? –

+0

你可以從Set中刪除元素,請參閱已編輯的答案@MacosxIam – Zohaib

+0

這給了我一個錯誤 - 線程「main」中的異常java.util.ConcurrentModificationException –

0

字符串在Java中是不可變的,這意味着當您調用word.replaceAll(word,"")時,它將返回字符串「」(您不分配給任何東西)。 不會更改,並且該集仍然指向舊值。您需要從Set中刪除

+0

我試過這個:newSet.remove(word);但它給了我一個錯誤 - java.util.ConcurrentModificationException –

+0

當你迭代它時你正在從Set中移除。您可以嘗試創建一個新的Set,*添加不是**的**的字符串,然後分配'newSet =(您剛剛創建的用於保存非長度爲5的字符串的集合)' –

+0

或者約翰·韋斯利王子建議,通過迭代Set的數組而不是Set本身。 –

0

當你發現長度爲5的字符串,你需要從組中刪除:

newSet.remove(word); 

正因爲如此,你似乎是試圖改變字爲空字符串,但字符串是不可變的。你的調用實際上做的是返回一個空字符串。

2

或其他建議你不能改變一個字符串原因是,代碼片斷:

import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 

public class TestString { 
public void remove5() { 
    Set<String> newSet = new HashSet<String>(); 
    newSet.add("hello"); 
    newSet.add("my"); 
    newSet.add("name"); 
    newSet.add("is"); 
    newSet.add("nonsense"); 
    for (Iterator<String> iter = newSet.iterator(); iter.hasNext();) { 
     if (iter.next().length() == 5) { 
      iter.remove(); 
     } 
    } 
    System.out.println(newSet); 
} 

public static void main(String[] args) { 
    new TestString().remove5(); 
} 
} 

如果您遍歷集合,並在循環中,您刪除的對象,它會拋出你ConcurrentModificationExceptionHastSet迭代器是一個失敗的快速迭代器。

+0

這是值得解釋的原因,其他答案導致['ConcurrentModificationException'](http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html)。 –

+0

更新我的答案,以迎合它。 – mprabhat

2

對於實際修改你的設置,你需要做這樣的事情:

Iterator<String> iter = newSet.iterator(); 
while (iter.hasNext()) 
    if (iter.next().length() == 5) 
     iter.remove(); 

由於字符串是不可變的,你不能修改已經添加到集合了,反正的,即使你可以在原地修改它們,用「」代替它們不會將它們從集合中刪除。

+0

+1。正是我要做的。 –

0
int i = 0; 
Set<String> newSet = new HashSet<String>(); 
newSet.add("hello"); 
newSet.add("my"); 
newSet.add("name"); 
newSet.add("is"); 
newSet.add("nonsense"); 
for(String word: newSet) 
{ 
    if(word.length()==5) 
    { 
     newSet.remove(i); 
    } 
    i++; 
}