Java 筛选标签列表

Java 筛选标签列表,java,Java,我有一个要筛选的标签列表,只保留标签“低”“低”“高” 我试图实现这一点: private List<Label> filterPriorityLabels(List<Label> labels) { for (ListIterator<Label> iter = labels.listIterator(); iter.hasNext();) { Label a = iter.next();

我有一个要筛选的标签列表,只保留标签
“低”“低”“高”

我试图实现这一点:

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;
    }
专用列表过滤器优先级标签(列表标签)
{
for(ListIterator iter=labels.ListIterator();iter.hasNext();)
{
标签a=iter.next();
如果(a.getName()!=“低”|“最低”|“高”)
{
iter.remove();
}
}
退货标签;
}
但我不能得到有效的例子。如何修复此代码

if (! (a.getName().equals("low") || a.getName().equals("lowest") || a.getName().equals("high")))
  • 在Java中,您将字符串(以及一般的对象)与
    equals()
    ,而不是==
  • 逻辑运算符是
    |
    ,而不是
    |
  • 它需要几个布尔表达式作为操作数。不是字符串

此外,方法的签名会让人认为该方法创建了另一个列表,其中包含原始列表的过滤元素,而实际上它修改了作为参数传递的列表。它应该返回void,或者创建并返回一个副本。

不要将字符串与
进行比较=但是
!等于()

更好的解决方案是使用列表的
contains()
方法

 List<String> acceptableNames = Arrays.asList("low","lowest","high");
 if (!acceptableNames.contains(a.getName()))
List acceptableNames=Arrays.asList(“低”、“低”、“高”);
如果(!acceptableNames.contains(a.getName()))

以下是一个完整的示例,基于:

私有静态最终列表可接受名称=
数组。asList(“低”、“低”、“高”);
专用列表过滤器三级标签(列表标签)
{
for(ListIterator iter=labels.ListIterator();iter.hasNext();)
{
最终标签a=iter.next();
如果(!acceptableNames.contains(a.getName())
{
iter.remove();
}
}
退货标签;
}
如果您使用的是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());
}
私有静态最终列表可接受名称=
数组。asList(“低”、“低”、“高”);
专用列表过滤器三级标签(列表标签)
{
返回labels.stream()
.filter(p->acceptableNames.contains(p.getName()))
.collect(Collectors.toList());
}

但是,请注意,与davidxxx的答案不同,这不会修改原始列表并返回它。相反,它保持原始列表不变并返回新列表。

if(a.getName()!=“low”|“lost”|“lost”|“high”)
可能应该是
if(a.getName()!=“low”&&a.getName()!=“lost”&&a.getName()!=“high”)
这段代码错得很厉害,我想知道你是否学过Java的基础知识?@domdom-循环头
的数量正好是正确的数字。@OusmaneMahyDiaw你是对的,很好。然后,我想再次指出对条件逻辑的绝对基本误解(
|
而不是
&&
等等)啊,该死的,我今天所有的评论都是垃圾。谢谢你指出我的错误@TedHoppI喜欢你个人资料上的Dijkstra引语。说得很对:)@davidxxx-谢谢。他有很多好的引语,但我认为这是他最好的引语之一。:)
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());
}