Заполнение диапазонов на основе некоторых указанных строк


Метод принимает два параметра. Если я называю его с двумя параметрами

первый : ["0-1000:2","1000-2000:3"]

во-вторых: initial

затем эти ожидаемые результаты:

  1. Первый ряд:

    rangeId: 0-1000,
    from: 0,
    to: 1000,
    issuingRange: initial,
    minUsers: 2
    
  2. Второй ряд:

    rangeId: 1000-2000
    from: 1000
    to: 2000
    issuingRange: initial
    minUsers: 3
    

Этот код работает, но я хотел бы улучшить его. Я могу использовать потоки в Java 8? Любое другое изменение или предложение может сделать код лучше?


private  List<Range> fillRanges(Object roleList, String issuingRange) {

if (roleList != null) {
    List<String> rangeList2 = null;
    if (roleList instanceof ArrayList<?>) {

        rangeList2 = (ArrayList<String>) roleList;
    } else if (roleList instanceof String) {
        rangeList2 = new ArrayList(Arrays.asList(roleList));
    }

    for (int i = 0; i < ((ArrayList) rangeList2).size(); i++) {
        String rangeId = "";
        String from = "";
        String to = "";
        String minUsers = "";
        String info = ((ArrayList) rangeList2).get(i).toString();

        logger.debug("info: " + info);

        if (info.indexOf(":") > -1) {
            rangeId = info.substring(0, info.indexOf(":"));
            minUsers = info.substring(info.indexOf(":") + 1);
            if (info.indexOf("-") > -1) {
                from = info.substring(0, info.indexOf("-"));
                to = info.substring(info.indexOf("-")+1, info.indexOf(":"));
            }
        } else {
            rangeId = info;
            if (info.indexOf("-") > -1) {
                from = info.substring(0, info.indexOf("-"));
                to = info.substring(info.indexOf("-")+1);
            }
            minUsers = "0";
        }

        ranges.add(new Range(rangeId, from, to, issuingRange, minUsers));
    }
}
return ranges;
}


97
-1
задан 26 февраля 2018 в 10:02 Источник Поделиться
Комментарии
1 ответ

Ваша функция, кажется, злоупотребляют roleList параметр. Есть два режима, в которых эта функция может быть вызвана: с одной String (в этом случае один Range добавляется), или с ArrayList<String> (в этом случае один Range добавляется к каждому элементу списка). Если вы позвоните с любого другого вида Object, то код падает с NullPointerException. Это не хороший дизайн.

Скорее всего, вы должны определить две отдельные функции для обработки этих двух режимов работы. Список-обработка версий просто цепи для обработки строк версия функции.

private void fillRanges(List<String> roleSpecs, String issuingRange) {
for (String roleSpec : roleSpecs) {
this.fillRanges(roleSpec, issuingRange);
}
}

private void fillRanges(String roleSpec, String issuingRange) {

}

Для реализации последней функции, я хотел бы избежать нарезки и перетасовки с помощью подстрок. Так как это анализ проблемы, которая включает в себя распознавание образов, я хотел бы использовать регулярное выражение вместо захвата подстроки интерес.

private static final Pattern RANGE_REGEX = Pattern.compile(
"^(?<rangeId>(?<from>\\d*)-?(?<to>\\d*))(?::(?<minUsers>\\d+))?$"
);

private void fillRanges(String roleSpec, String issuingRange) {
logger.debug("Role: " + roleSpec);
Matcher m = RANGE_REGEX.matcher(roleSpec);
if (!m.matches()) {
throw new IllegalArgumentException(roleSpec);
}
ranges.add(new Range(
m.group("rangeId"),
m.group("from"),
m.group("to"),
issuingRange,
m.group("minUsers") == null ? "0" : m.group("minUsers")
));
}

2
ответ дан 27 февраля 2018 в 01:02 Источник Поделиться