Java中使用范围的查找枚举

时间:2018-06-27 16:34:58

标签: java enums

我有这个枚举:

System.AppDomain.CurrentDomain.BaseDirectory + "/Commands.html"

要返回public enum AccountRange { RANGE1("100,200"), RANGE2("201,300"), RANGE3("301,900"); private final String rangeAccount; private static final Map<String, AccountRange> lookup = new HashMap<String, AccountRange>(); static { for (AccountRange d : AccountRange.values()) { lookup.put(d.getRangeAccount(), d); } } private AccountRange(String rangeAccount) { this.rangeAccount = rangeAccount; } public String getRangeAccount() { return rangeAccount; } public static AccountRange get(String abbreviation) { return lookup.get(abbreviation); } } ,我需要使用RANGE1

来调用枚举。

但是问题是我需要用一个简单的值来调用枚举,例如:

AccountRange.get("100,200"),我需要枚举返回AccountRange.get("108"),因为108在100到200之间的第一范围内。

RANGE1,我需要枚举返回AccountRange.get("600")

3 个答案:

答案 0 :(得分:4)

您可以将范围存储为一对整数,并遍历枚举的值,以找到包含您要查找的参数的范围:

public enum AccountRange {

    RANGE1(100, 200), RANGE2(201, 300), RANGE3(301, 900);

    private final int min;
    private final int max;

    private AccountRange(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public String getRangeAccount() {
        return String.format("%d,%d", min, max);
    }

    public static AccountRange get(int val) {
        return Arrays.stream(values())
                     .filter(r -> val >= r.min && val <= r.max)
                     .findFirst()
                     .orElse(null);
    }
}

答案 1 :(得分:3)

如果您对使用google.common.collect的替代解决方案感兴趣:

    RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
    rangeMap.put(Range.closed(100, 200), "RANGE1");
    rangeMap.put(Range.closed(201, 300), "RANGE2");
    rangeMap.put(Range.closed(301, 900), "RANGE3");

    System.out.println(rangeMap.get(108));//RAGE1
    System.out.println(rangeMap.get(600));//RAGE3

答案 2 :(得分:1)

如果您想坚持枚举,可以采取以下措施:

public enum AccountRange {

    RANGE1 (100, 200), 
    RANGE2 (201, 300), 
    RANGE3 (301, 900);

    private final long min;
    private final long max;

    private AccountRange (long min, long max) {
        this.min = min;
        this.max = max;
    }

    public long getRangeMin () {
        return min;
    }

    public long getRangeMax () {
        return min;
    }

    public static AccountRange get (long value) {
        AccountRange[] accRanges = values ();

        for (AccountRange accRange : accRanges) {
            long minRange = accRange.getRangeMin ();
            long maxRange = accRange.getRangeMax ();

            if (value >= minRange && value <= maxRange) {
                return accRange;
            }
        }

        return null;
    }
}
相关问题