在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());
}
}
}