HashSet迭代器检查字母

时间:2019-11-24 08:31:20

标签: java string iterator hashset letter

我有一个String哈希集(称为“名称”),我想从中删除所有包含至少一个不是大写字母的字符的String。 我写了这段代码,它不起作用:

Iterator<String> iterator=names.iterator();
while(iterator.hasNext()) {
    for (int i=0; i<iterator.next().length(); i++) {
        if (iterator.next().charAt(i) < 'A' || iterator.next().charAt(i) > 'Z') {
            names.remove(iterator.next());
        }
    }
}

2 个答案:

答案 0 :(得分:5)

另一种解决方案,如果您正在使用Java-8,则使用removeIf和正则表达式[A-Z]+,如下所示:

Set<String> names = //.. some inputs
names.removeIf(str -> !str.matches("[A-Z]+")); // remove if not matches [A-Z]+

请注意,在此解决方案中,您根本不需要将列表转换为迭代器,也不需要通过循环检查字符,只需通过正则表达式进行匹配即可。

答案 1 :(得分:4)

您的代码存在三个问题:

  1. 您应该在while循环的每次迭代中调用一次iterator.next()(因为每次调用iterator.next()都会返回一个不同的元素)。

  2. 您应该使用Iterator的remove方法删除当前元素(这是在Collection上进行迭代的同时对其进行结构更改的唯一有效方法)。

  3. 在删除当前元素时,您应该跳出循环,以避免尝试多次删除同一元素。

    Iterator<String> iterator = names.iterator();
    while (iterator.hasNext()) {
        String str = iterator.next();
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) < 'A' || str.charAt(i) > 'Z') {
                iterator.remove();
                break;
            }
        }
    }