List<Enum> 包含 String

4

我有一个像下面这样的枚举列表 -

List<Status> statusList;

状态定义如下:

enum Status { YES , NO , MAYBE }

这个列表包含:
Status stat = Status.YES;
statusList.add(stat);

我有一个变量

Status statusVar = Status.YES;

我试图进行如下比较,但它没有按照我的预期工作,因为它在比较引用。下面的代码返回false。请问你能否提供一个解决方案?
statusList.contains(statusVar)

编辑:以下是不起作用的代码。状态是字符串而不是枚举。

import java.util.ArrayList;
import java.util.List;
public class Test {
    private enum Status {
        YES , NO , MAYBE
    }


    public static void main (String[] args){

        List<Status> statusList = new ArrayList<Status>();
        String status = "YES";
        statusList.add(Status.YES);

        if(statusList.contains(status)){
            System.out.println(" Yes ");
        } else {
            System.out.println(" No ");
        }

    }

}

9
你能否提供一个 最小化、完整化、可验证的示例程序,以演示问题?按照现有的写法,这应该是可行的。 - John Kugelman
5
参考文献相同,因此比较参考文献并不是原因。 - RealSkeptic
2
一个字符串永远不会等于一个枚举:它们不是同一种类型。你可以使用 if(statusList.contains(Status.valueOf(status))){ 将字符串转换为相应的枚举。 - JB Nizet
有没有办法使用contains方法,还是必须迭代每个元素并将其转换为字符串后再进行比较? - Punter Vicky
谢谢JB,这个很好用! - Punter Vicky
显示剩余3条评论
4个回答

7

如果您正在执行包含操作,使用EnumSet会更加高效。

Set<Status> status = EnumSet.of(Status.YES);
assert status.contains(Status.YES);

然而,List<Status> 也可以工作。

你是对的,它确实比较引用,但只有在以下情况下才会失败:

  • 多个类加载器,并且类Status实际上是不同的。
  • 你创建了Status的新实例,你可以使用Unsafe.allocateInstance(Status.class)来完成这个操作。

更可能的情况是你没有测试你认为你测试的东西,而且情况并不完全符合你描述的情况。


2
private enum Status {
    YES , NO , MAYBE
    ;
    public Status getByName(String name){
        for (Status st : Status.values()) {
            if (st.toString().equals(name)){
                return st;
            }
        }
        return null;
    }
}

试一下这个!


1
我不知道 Status.valueOf(status),太好了! - Jandrei

1
你可以添加一个名为toString()和contains()的函数作为辅助函数:
private enum Status {
    YES("Yes") , NO ("Yes") , MAYBE("Yes");
    private final String label;

    /**
     * Instantiates a new Status.
     * @param label the label
     */
    private Status (final String label) {
        this.label = label;
    }

    @Override
    public String toString() {
        return label;
    }

    public static boolean contains(final String test) {

        for (final Status value : Status.values()) {
            if (value.toString().equals(test)) {
                return true;
            }
        }
        return false;

    }
}

0
enum Status { YES , NO , MAYBE }

public static void main(String[] args) {
    List<Status> lista = new ArrayList<>();
    lista.add(Status.YES);

    Status stat = Status.YES;

    System.out.println(lista.contains(Status.YES));//true
    System.out.println(lista.contains(stat));//true

}

我编写了这段代码,并且双重验证后,它完美地工作了。
或者
你记得要对变量statusList进行实例化。

泛型在运行时不会导致错误,并且填充字符串,是吗? - Jandrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接