将特定字符串映射到常量整数?

时间:2010-11-09 21:05:12

标签: java string integer constants

给定一组特定的字符串,将它们映射到相应的整数集的最佳方法是什么?假设我有一个带有几个整数常量的类,我在内部使用它,但是需要接收传入的外部字符串并确定它们映射到的正确的相应整数常量。

这是一个简化的例子:

public class Example {
    public static final int ITEM_APPLE = 0;
    public static final int ITEM_BANANA = 1;
    public static final int ITEM_GRAPE = 3;

    public void incomingData(String value) {
        // Possible values would be "apple", "banana", and "grape" in this case.
    }
}

从该值到相应的整数常量,最合适的方法是什么?一个HashMap?或者以任何方式在静态成员中定义这些映射?另一个想法?

4 个答案:

答案 0 :(得分:6)

我会使用HashMap,因为它最接近你想要达到的目标,因此是一个可维护的解决方案。您可以定义静态HashMap:

Class Example {
    public static final int ITEM_APPLE = 0;
    public static final int ITEM_BANANA = 1;
    public static final int ITEM_GRAPE = 3;

    private static final Map<String, Integer> fruitCodes = new HashMap<String, Integer>();

    static {
        fruitCodes.put("apple", ITEM_APPLE);
        fruitCodes.put("banana", ITEM_BANANA);
        // ...
    }


    public void incomingData(String value) {
        // Possible values would be "apple", "banana", and "grape" in this case.
        Integer code = fruitCodes(value);

        if (null == code) {
            throw new IllegalArgumentException("Forbidden fruit: " + value);
        }
    }
}

答案 1 :(得分:3)

是的,请使用enum。您可以为每个枚举分配一个整数值,或者只使用ordinal()

public enum ExampleEnum {
    ITEM_APPLE(0), ITEM_BANANA(1), ITEM_GRAPE(3);

    private final int intValue;

    private ExampleEnum (int intValue) {
      this.intValue = intValue;
    }

    public int intValue() {
      return intValue;
    }
}

然后使用例如ExampleEnum.valueOf("ITEM_APPLE").intValue()将字符串解析为int

如果int值是顺序的并且从零开始,则可以完全删除intValue字段:

public enum ExampleEnum {
    ITEM_APPLE, ITEM_BANANA, ITEM_GRAPE;
}

并使用ExampleEnum.valueOf("ITEM_APPLE").ordinal()

答案 2 :(得分:0)

你'可以'使用反思,例如:

Example.class.getField("ITEM_" + input.toUpperCase()).getInt(null);

但是,您应该考虑使用枚举,或者如果没有太多可能性,只需使用一组else if语句......

答案 3 :(得分:0)

我还建议使用Enum方法,虽然ExampleEnum.valueOf(“ITEM_APPLE”)。ordinal()必须进行字符串比较才能得到答案,而HashMap会给你一个O(1)复杂度。

可能是一个危险的想法,但只是为了好玩(这是怎么回事):

class Example {
    public static final int ITEM_APPLE = "apple".hashCode();
    public static final int ITEM_BANANA = "banana".hashCode();
    public static final int ITEM_GRAPE = "grape".hashCode();

    public int incomingData(String value) {
        return value.hashCode();
    }

    public static void main(String[] args) {
        Example x = new Example();
        if (ITEM_APPLE == x.incomingData("apple"))
            System.out.println("ITEM_APPLE");
    }
    }
}

您只需确保字符串值的哈希码不会发生冲突; - )