从列表中删除类型的项目

时间:2012-01-25 17:42:05

标签: java list

我不断遇到类似下面代码的技术,我需要从列表中过滤出一种枚举类型。

有没有更有效的方法来做到这一点?

    private List<TestResult> removeInfo(List<TestResult> testResults) {
    List<TestResult> tmpT = new ArrayList<TestResult>();
    for(TestResult t : testResults) {
        if(!t.getSeverity().equals(Severity.INFO)) {
            tmpT.add(t);
        }
    }
    return tmpT;
}

收藏是我的第一个想法,但不确定。

干杯 d

2 个答案:

答案 0 :(得分:0)

您可以使用迭代器就地过滤列表:

Iterator<TestResult> iterator = testResults.iterator();
while(iterator.hasNext()) {
    TestResult result = iterator.next();
    if (!result.getSeverity().equals(Severity.INFO)) {
        iterator.remove();
    }
}

//Now testResults contains all elements that do not have Severity of INFO

这是Marvo评论的一个例子。它的内存效率更高,但只是时间效率更高的代码。再次,正如Marvo所说,通过使用LinkedList可以获得一些改进。但是,除非您处理大量数据,否则我认为您不会注意到差异。

答案 1 :(得分:0)

Google的Guava有一些有效的方法:

private Iterable<TestResults> removeInfo(List<TestResults> list){
    return Iterables.filter(list, new Predicate<TestResults>(){
        public boolean apply(TestResults input){
            return !input.getSeverity.equals(Severity.INFO);
        }
    }
}

这根本不会复制数据,如果List的迭代器不支持删除,它仍然有效。