Сортировка элементов в списке на основе положения


Я написал код, который сортирует элементы на основе параметров (IconConfiguration). У меня есть карта пунктов, у индекса и товар поэтому в основном предопределенный список на какой элемент индекса должно быть, и параметр maxPositions это предел того, насколько большой мой список можно. Я написал код, но ее однообразная и довольно уродливые, когда я проверить его, но я не могу получить представление о том, что рефакторинг.

private List<GWBaseData> applyItemsIndex(List<GWBaseData> gwInputBaseDataList) { //TODO: Refactor repetitive code?
        List<GWBaseData> gwBaseDataList = new ArrayList<>();

        if (iconConfiguration.getMax_positions() != -1) {
            for (int i = 0; i < gwInputBaseDataList.size(); i++) {
                if (gwBaseDataList.size() < iconConfiguration.getMax_positions()) {
                    if (getItemsMap().get(i) != null && getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)) != null) {
                        gwBaseDataList.add(i, getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)));
                    } else {
                        for (int j = 0; j < gwInputBaseDataList.size(); j++) {
                            if (!gwBaseDataList.contains(gwInputBaseDataList.get(j))) {
                                gwBaseDataList.add(gwInputBaseDataList.get(j));
                                break;
                            }
                        }
                    }
                }
            }
        } else {
            for (int i = 0; i < gwInputBaseDataList.size(); i++) {
                if (getItemsMap().get(i) != null && getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)) != null) {
                    gwBaseDataList.add(i, getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)));
                } else {
                    for (int j = 0; j < gwInputBaseDataList.size(); j++) {
                        if (!gwBaseDataList.contains(gwInputBaseDataList.get(j))) {
                            gwBaseDataList.add(gwInputBaseDataList.get(j));
                            break;
                        }
                    }
                }
            }
        }

        return gwBaseDataList;
    }

Так что в основном вся разница между обеими блока только одного дополнительного если (если (gwBaseDataList.size() < iconConfiguration.getMax_positions()))



453
5
задан 3 апреля 2018 в 11:04 Источник Поделиться
Комментарии
2 ответа

Добавить дополнительную локальную переменную перед первым циклом:

int maxItems = iconConfiguration.getMax_positions();
if (maxItems == -1) {
maxItems = gwInputBaseDataList.size();
}

Таким образом, если вы не указали в конфигурации вы просто использовать "все" элементы ввода.

Вы можете пойти немного дальше и использовать это как условие на внешний цикл for:

for (int i = 0; i < maxItems; i++) {
if (getItemsMap().get(i) != null && getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)) != null) {
gwBaseDataList.add(i, getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)));
} else {
for (int j = 0; j < gwInputBaseDataList.size(); j++) {
if (!gwBaseDataList.contains(gwInputBaseDataList.get(j))) {
gwBaseDataList.add(gwInputBaseDataList.get(j));
break;
}
}
}
}
return gwBaseDataList;

Я не мог на самом деле проверить этот код, чтобы убедиться, что это не с 1 по индексу, когда вы попробуете это сами. И на всякий случай проверить, если это на самом деле делает то, что вы хотите это делать во всех крайних случаях.


Редактирование исправление:

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

if(maxItems == -1 || maxItems > gwInputBaseDataList.size()){

4
ответ дан 3 апреля 2018 в 12:04 Источник Поделиться


  • Если заменить это условие:

    if (gwBaseDataList.size() < iconConfiguration.getMax_positions())

    С этим условием:

    if (iconConfiguration.getMax_positions() == -1
    || gwBaseDataList.size() < iconConfiguration.getMax_positions())

    Тогда вы можете избавиться от этого внешняя конструкция:

    if (iconConfiguration.getMax_positions() != -1) {
    //...
    } else {
    //...
    }

    И вы можете удалить все, что вложенный в else блок данной конструкции. Если я не ошибаюсь, это должно сделать это.


  • Другое предложение: вы можете заменить это:

    for (int j = 0; j < gwInputBaseDataList.size(); j++) {
    if (!gwBaseDataList.contains(gwInputBaseDataList.get(j))) {
    gwBaseDataList.add(gwInputBaseDataList.get(j));
    break;
    }
    }

    С повышенной for-петли:

    for (GWBaseData gwInputBaseData : gwInputBaseDataList) {
    if (!gwBaseDataList.contains(gwInputBaseData)) {
    gwBaseDataList.add(gwInputBaseData);
    break;
    }
    }

    Я нахожу, что легче читать, поскольку в данном случае, сам индекс не имеет никакого отношения и только этот пункт имеет значение.


  • Рефакторинг далее: поскольку нет смысла продолжать цикл gwBaseDataList больше, чем максимальное количество элементов, вы также можете указать это требование в прекращении состояния for петли:

    for (int i = 0;
    i < gwInputBaseDataList.size()
    && (iconConfiguration.getMax_positions() == -1
    || gwBaseDataList.size() < iconConfiguration.getMax_positions());
    i++) {
    if (getItemsMap().get(i) != null && getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)) != null) {
    gwBaseDataList.add(i, getBaseDataInListById(gwInputBaseDataList, getItemsMap().get(i)));
    } else {
    for (GWBaseData gwInputBaseData : gwInputBaseDataList) {
    if (!gwBaseDataList.contains(gwInputBaseData)) {
    gwBaseDataList.add(gwInputBaseData);
    break;
    }
    }
    }
    }

    Таким образом, Вы имеете один вложенный if-блок меньше.


3
ответ дан 3 апреля 2018 в 12:04 Источник Поделиться