Как удалить строки длиной 5 из набора? - PullRequest
0 голосов
/ 01 декабря 2011

Я хочу удалить строки длины 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

Не могли бы вы помочь?

Ответы [ 7 ]

2 голосов
/ 01 декабря 2011

Для фактического изменения вашего набора вам нужно сделать что-то вроде этого:

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

Поскольку строки являются неизменяемыми, вы не можете изменять те, которые уже были добавлены в набор, и в любом случае, дажеесли бы вы могли изменить их на месте, замена их на "" не удалила бы их из набора.

2 голосов
/ 01 декабря 2011

Как и предполагалось, вы не можете изменить строковую причину, фрагмент кода:

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();
}
}

Если вы выполните итерацию по набору и в цикле удалите объект, он выдаст вам ConcurrentModificationException, поскольку HastSet итератор - быстрый итератор с ошибками.

2 голосов
/ 01 декабря 2011
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 голосов
/ 08 декабря 2011
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++;
}
0 голосов
/ 01 декабря 2011

Когда вы найдете строку длиной 5, вам нужно удалить ее из набора:

newSet.remove(word);

По сути, вы пытаетесь изменить слово на пустую строку, но строки неизменны. На самом деле ваш вызов возвращает пустую строку.

0 голосов
/ 01 декабря 2011

Строки являются неизменяемыми в Java, то есть, когда вы вызываете word.replaceAll(word,""), он возвращает строку «» (которую вы никому не назначаете). слово не изменяется, и набор все еще указывает на старое значение слово .Вам нужно удалить word из самого набора.

0 голосов
/ 01 декабря 2011

Строки: immutable, изменения, внесенные в строку 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...