поиск enum с использованием диапазона в Java - PullRequest
0 голосов
/ 27 июня 2018

У меня есть это перечисление:

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 мне нужно вызвать enum, используя: AccountRange.get("100,200")

Но проблема в том, что мне нужно вызвать enum с простым значением, например:

AccountRange.get("108") и мне нужно, чтобы перечисление возвращало RANGE1, потому что 108 находится в первом диапазоне между 100 и 200

AccountRange.get("600") и мне нужно, чтобы перечисление возвращалось RANGE3

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вот что вы можете сделать, если хотите придерживаться перечислений:

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;
    }
}
0 голосов
/ 27 июня 2018

Если вас интересует альтернативное решение с 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
0 голосов
/ 27 июня 2018

Вы можете сохранить диапазон в виде пары целых чисел и перебрать значения перечисления, чтобы найти диапазон, содержащий искомый аргумент:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...