Java 如何从提供的值返回枚举对象

Java 如何从提供的值返回枚举对象,java,enums,Java,Enums,我的枚举如下: enum Mobile { Samsung(400), Nokia(250),Motorola(325); int price; Mobile(int p) { price = p; } int showPrice() { return price; } } 如何获得枚举对象提供的值 e、 g如果输入为400,则输出应为Samsung Enum对象 请建议。在Mobileenum本身中创建一个静态方法 public

我的枚举如下:

enum Mobile {
   Samsung(400), Nokia(250),Motorola(325);

   int price;
   Mobile(int p) {
      price = p;
   }
   int showPrice() {
      return price;
   } 
}
如何获得枚举对象提供的值 e、 g如果输入为400,则输出应为Samsung Enum对象


请建议。

Mobile
enum本身中创建一个静态方法

public static Mobile getByPrice(int price) {
    for (Mobile mobile : Mobile.values()) { // iterate all the values of enum
        if (mobile.price==price) { // compare the price
            return mobile; // return it
        }
    }
    return null; 
    // either return null or throw IllegalArgumentException
    //throw new IllegalArgumentException("No mobile found in this price:"+price);
}

Mobile
enum本身中创建一个静态方法

public static Mobile getByPrice(int price) {
    for (Mobile mobile : Mobile.values()) { // iterate all the values of enum
        if (mobile.price==price) { // compare the price
            return mobile; // return it
        }
    }
    return null; 
    // either return null or throw IllegalArgumentException
    //throw new IllegalArgumentException("No mobile found in this price:"+price);
}
提供从值到枚举实例的映射。这将是一个静态变量,可以(必须)由构造函数填充:

(根据Pshemo的评论编辑代码)

enum-Mobile{
三星(400)、诺基亚(250)、摩托罗拉(325);
私有静态最终映射移动设备=新HashMap();
静止的{
对于(移动m:values())
移动电话。卖出价(m.price,m);
}
国际价格;
流动电话(INTP){
价格=p;
}
int showPrice(){
退货价格;
}
公共静态移动字节值(int值){
返回手机。获取(值);
}
}
请注意,其中涉及一些自动装箱和取消装箱。如果不存在这个值,请考虑抛出非法的异常。< /P> 另请注意:这要求所有值都是不同的

提供从值到枚举实例的映射。这将是一个静态变量,可以(必须)由构造函数填充:

(根据Pshemo的评论编辑代码)

enum-Mobile{
三星(400)、诺基亚(250)、摩托罗拉(325);
私有静态最终映射移动设备=新HashMap();
静止的{
对于(移动m:values())
移动电话。卖出价(m.price,m);
}
国际价格;
流动电话(INTP){
价格=p;
}
int showPrice(){
退货价格;
}
公共静态移动字节值(int值){
返回手机。获取(值);
}
}
请注意,其中涉及一些自动装箱和取消装箱。如果不存在这个值,请考虑抛出非法的异常。< /P>
另请注意:这要求所有值都是不同的

嗯,你可以很容易地建立一个
地图。你试过什么?例如,如果您提供的值为350,您希望得到什么?该值高于或低于?如果有几个相同价格的移动枚举,该怎么办?在您的情况下可能吗?如果枚举中的对象数量有限,那么您可以愉快地迭代所有
值()
,以获得所需的值。您可以非常轻松地构建
映射。你试过什么?例如,如果您提供的值为350,您希望得到什么?该值高于或低于?如果有几个相同价格的移动枚举,该怎么办?在您的情况下可能吗?如果枚举中的对象数量有限,那么您可以愉快地迭代所有
值()
,以获得所需的值。您可以(也可以不这样做)视情况而定,我更希望它的行为方式与valueOf相同,并在找不到值时抛出IllegalArgumentException,而不是返回null,但这是实现者的选择。@Caleryn是的,我非常同意你的意见。这是我在有类似要求时所做的。你可以(也可以不可以)视情况而定,我更希望它的行为方式与valueOf相同,并在找不到值时抛出IllegalArgumentException,而不是返回null,但这是实现者的选择。@Caleryn是的,我非常同意你的意见。这是我在有类似要求时所做的。Ececuting
MOBILES.put(p,this)是不可能的,因为在初始化枚举值时,如
Samsung
static map
MOBILES
尚未初始化。解决此问题的一种可能方法是在初始化所有枚举字段后用值填充映射,因此可以在声明
MOBILES
后放置类似
static{for(Mobile m:values())MOBILES.put(m.price,m);}
的代码。尝试了这两种方法。我收到一个错误,因为:无法引用initializer@Pshemo你是对的。所以我修改了代码,现在它可以正常工作了@AnushreeAcharjee:只需向该枚举添加一个main方法,并在其中运行语句
System.out.println(MOBILES)
。你会看到,它工作得很好。Ececuting
MOBILES.put(p,this)是不可能的,因为在初始化枚举值时,如
Samsung
static map
MOBILES
尚未初始化。解决此问题的一种可能方法是在初始化所有枚举字段后用值填充映射,因此可以在声明
MOBILES
后放置类似
static{for(Mobile m:values())MOBILES.put(m.price,m);}
的代码。尝试了这两种方法。我收到一个错误,因为:无法引用initializer@Pshemo你是对的。所以我修改了代码,现在它可以正常工作了@AnushreeAcharjee:只需向该枚举添加一个main方法,并在其中运行语句
System.out.println(MOBILES)
。你会看到,它工作得很好。