我有一个标签列表,我想过滤并只留下标签"low" "lowest" "high"
我试图实现这个:
private List<Label> filterPriorityLabels(List<Label> labels)
{
for (ListIterator<Label> iter = labels.listIterator(); iter.hasNext();)
{
Label a = iter.next();
if (a.getName() != "low" | "lowest" | "high")
{
iter.remove();
}
}
return labels;
}
但我无法得到实际的例子。我如何修复此代码?
答案 0 :(得分:2)
不要将字符串与!=
进行比较,而是!equals()
更精细的解决方案是使用List的contains()
方法。
List<String> acceptableNames = Arrays.asList("low","lowest","high");
if (!acceptableNames.contains(a.getName()))
答案 1 :(得分:1)
if (! (a.getName().equals("low") || a.getName().equals("lowest") || a.getName().equals("high")))
equals()
进行比较,而不是== or
逻辑运算符为||
,而不是|
此外,您的方法的签名导致认为该方法创建另一个列表,包含原始列表的过滤元素,而它实际上修改作为参数传递的列表。它应该返回void,或者创建并返回一个副本。
答案 2 :(得分:1)
以下是基于the answer by @davidxxx的完整示例:
private static final List<String> acceptableNames =
Arrays.asList("low", "lowest", "high");
private List<Label> filterPriorityLabels(List<Label> labels)
{
for (ListIterator<Label> iter = labels.listIterator(); iter.hasNext();)
{
final Label a = iter.next();
if (!acceptableNames.contains(a.getName())
{
iter.remove();
}
}
return labels;
}
如果你正在使用Java 8,那么使用流的方式更好:
private static final List<String> acceptableNames =
Arrays.asList("low", "lowest", "high");
private List<Label> filterPriorityLabels(List<Label> labels)
{
return labels.stream()
.filter( p -> acceptableNames.contains(p.getName()) )
.collect(Collectors.toList());
}
请注意,与davidxxx的答案不同,这不会修改原始列表并将其返回。相反,它保持原始列表不变并返回一个新列表。