筛选标签列表

时间:2017-04-16 15:22:09

标签: java

我有一个标签列表,我想过滤并只留下标签"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;
    }

但我无法得到实际的例子。我如何修复此代码?

3 个答案:

答案 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")))
  • 在Java中,您将字符串(和一般对象)与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的答案不同,这不会修改原始列表并将其返回。相反,它保持原始列表不变并返回一个新列表。