过滤字符串的ArrayList

时间:2011-07-18 16:23:28

标签: java

我有一个字符串数组列表,我想删除低于一定长度的字符串。我在想这个方法:

        for (int i = 0; i < result.size(); i++) {
            if (result.get(i).split("\\s").length != maxLength) {
                System.out.println(result.get(i));
                result.remove(i);
}
        }

但它只删除了几个条目,因为当它删除一个条目时,它会移动下一个条目以移除一个条目。另外一种方法是什么

8 个答案:

答案 0 :(得分:3)

使用迭代器,例如:

final Iterator<String> x = list.iterator();
while (iterator.hasNext()) {
    if (someCondition) {
        iterator.remove();
    }
}

答案 1 :(得分:3)

永远不要以这种方式从ArrayList中删除。改为使用Iterator:

Iterator<String> stringIterator = result.iterator();
while (stringIterator.hasNext()) {
    String string = stringIterator.next();
    if (string.split("\\s").length != maxLength) {
        System.out.println(string);
        stringIterator.remove();
    }
}

答案 2 :(得分:3)

如果您碰巧使用Commons Collections

CollectionUtils.filter(result, new Predicate()
{
    @Override
    public boolean evaluate(Object object)
    {
        return ((String) object).split("\\s").length >= maxLength;
    }
}));

答案 3 :(得分:2)

尝试从最后一个迭代到第一个:

    for (int i = result.size() - 1; i >= 0; i--) {
        if (result.get(i).split("\\s").length != maxLength) {
            System.out.println(result.get(i));
            result.remove(i);
        }
    }

答案 4 :(得分:2)

当你删除一个时,你应该减少索引,以考虑后面的那些已经移位,如result.remove(i--);

答案 5 :(得分:1)

您需要再次修改i以确保它涵盖数组列表的完整序列,或者首先转到最后一个&gt;,如其他答案中所示。

for (int i = 0; i < result.size(); i++) {
    if (result.get(i).split("\\s").length != maxLength) {
        result.remove(i);
        i--; // everything has been moved up in the arraylist
    }
}

此外,ArrayList需要线性时间来删除单个元素,因此重复删除是一个坏主意。

使用LinkedList,它可以在迭代期间以恒定时间移除,或者首先收集HashSet中的元素,然后使用Collection.removeAll(Collection)在最后删除它们。

对于ArrayList,removeAll方法占用与列表大小成比例的时间乘以参数集合的查找时间。使用HashSet作为参数应该最小化所需的时间。

如果只删除一些值,任何集合都可能就足够了。

LinkedList tmpLinkedList = new LinkedList(result);
for (Iterator iter = tmpLinkedList.iterator(); iter.hasNext() {
    if (iter.next().split("\\s").length != maxLength))
        iter.remove();
}
result.clear();
result.addAll(tmpLinkedList);

或者:

HashSet toRemove = new HashSet();
//for (Iterator iter = myarraylist.iterator(); iter.hasNext() {
for (String s : result) {
    if (s.split("\\s").length != maxLength)
        toRemove.add(elem);
}
result.removeAll(toRemove);

答案 6 :(得分:1)

你需要从最后开始,一路走到前面。

for (int i = result.size() - 1; i >= 0; i--) {
    if (result.get(i).length < maxLength) {
        System.out.println(result.get(i));
        result.remove(i);
    }
}

答案 7 :(得分:1)

要从集合中删除元素,您应该使用迭代器。

for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
      String s = iter.next();
      if (s.split("\\s").length != maxLength) {
        iter.remove();
      }
      else {
        System.out.println(s);
      }
    }