在JAVA中基于值参数分配枚举值

在JAVA中基于值参数分配枚举值,java,enums,Java,Enums,我有一门卡片课: public class Card{ private final Rank rank; public Rank rank() { return rank; } public Card(Rank rank) { this.rank = rank; } } 其中,Rank是这样定义的枚举: enum Rank { TWO ("2"), THREE ("3"), FOUR ("4"),

我有一门卡片课:

public class Card{        
    private final Rank rank;
    public Rank rank() { return rank; }
    public Card(Rank rank) {
        this.rank = rank;
    }    
}
其中,Rank是这样定义的枚举:

enum Rank {
    TWO ("2"),
    THREE ("3"),
    FOUR ("4"),
    private final String rankNum;
    private Rank(String rankNum) { this.rankNum = rankNum; }
    public String rankNum(){ return rankNum; }
}
所以我的目标是输入一个字符串“2”作为命令行参数,然后创建一个新的card对象,其秩值为2。如果输入为“2”,则可以执行此操作,但如果输入为“2”,则我不知道如何执行此操作

如果输入为“2”,我将执行以下操作:

Card firstCard = new Card(Rank.args[0]);

我希望这个问题的措词不要太糟糕或太明显,因为你可以看出我还处于初级阶段,但我已经搜索了这个问题好几个小时都没有结果。

如果你期望的输入是
“2”
(与
“2”
相反),你可以在你的枚举中添加一个实用工具静态方法

类似于:

public static Rank forValue(String value) {
    // null/empty check
    if (value == null || value.isEmpty()) {
        throw new IllegalArgumentException();
    }
    // iterates enum values
    for (Rank r : Rank.values()) {
        // found a match
        if (r.rankNum().equals(value)) {
            return r;
        }
    }
    // iteration over, no match found
    throw new NoSuchElementException();
}

你不能那样做。您应该检查命令行参数是否等于任何秩值,然后创建新卡

使用Rank.lookupByNumber(“2”)获得秩2

import java.util.HashMap;

enum Rank {
    TWO("2"), THREE("3"), FOUR("4");

    private static final HashMap<String, Rank> lookupTable = new HashMap<>();

    static {
        for (Rank rank : Rank.values()) {
            lookupTable.put(rank.rankNum, rank);
        }
    }

    private final String rankNum;

    private Rank(String rankNum) {
        this.rankNum = rankNum;
    }

    public String rankNum() {
        return rankNum;
    }

    public static Rank lookupByNumber(String number) {
        return lookupByNumber(number);
    }
}
import java.util.HashMap;
枚举秩{
两个(“2”)、三个(“3”)、四个(“4”);
private static final HashMap lookupTable=new HashMap();
静止的{
for(秩:Rank.values()){
lookupTable.put(rank.rankNum,rank);
}
}
私有最终字符串rankNum;
私有秩(字符串rankNum){
this.rankNum=rankNum;
}
公共字符串rankNum(){
返回rankNum;
}
公共静态秩lookupByNumber(字符串编号){
返回lookupByNumber(number);
}
}

在静态块中,使用作为键提供的字符串初始化lookupTable。因此,您可以通过提供的字符串非常轻松、非常快速地获取秩枚举

没有其他方法,然后循环遍历
枚举
的值,并检查给定值是否与
枚举
常量中的任何值匹配

String value = //given value Ex: "2"
for (Rank rank : Rank.values()) {
        if (rank.rankNum().equals(value)) {
            return rank;
        }
}
这个怎么样

public enum Rank {

    TWO ("2"),
    THREE ("3"),
    FOUR ("4");

    private String description;

    private Rank(final String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return this.description;
    }
主要内容:


可能重复使用的
valueOf(“你的价值”)
我甚至还不能投票!这看起来很有用,我现在就试试。谢谢,太棒了,谢谢!!这很有效。除了您在第7行中编写的一件事之外,它必须是
Rank.values()
,这样可以工作,但每次查找时循环效率很低。请查看我的答案,我相信这是一个非常优雅和快速的解决方案。了解要点,谢谢。。。对于类项目来说,这应该足够了:)@triadiktyo没有讨论解决方案的逻辑,但是您知道,
HashTable
被淘汰,而
HashMap
用于线程不安全,而
ConcurrentHashMap
用于线程安全映射,对吗?还有另一种方法。请看一下我的答案,我相信这是一个非常优雅的方式it@triadiktyo是的,你也可以这样做。我的意思是API并没有被证明是一种可以做到这一点的方法。谢谢Sumit做了类似的事情this@AlexLama欢迎您。:)
public static void main( String[] args ) throws Exception {

    if(args.length > 0) {
        String rank = args[0].trim();
        if (rank.equals(Rank.TWO.toString())) {
            System.out.println("entered rank is: " + Rank.TWO.getDescription());
        }
    }
}