我不断遇到类似下面代码的技术,我需要从列表中过滤出一种枚举类型。
有没有更有效的方法来做到这一点?
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
答案 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的迭代器不支持删除,它仍然有效。