我有这个枚举:
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")
答案 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;
}
}