有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中使用范围查找枚举

我有这个枚举:

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")

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

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

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


共 (3) 个答案

  1. # 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;
        }
    }
    
  2. # 2 楼答案

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

    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);
        }
    }
    
  3. # 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