Java дважды перебирает карту, прежде чем решить, удалять ли объект - PullRequest
0 голосов
/ 23 мая 2018

У меня есть карта Строка объекта.Мне нужно дважды повторить его, прежде чем решить, удалять его или нет.

protected void removeDayOutOfRangeObjects(Map<Object, String> objects, Calendar[] clientTimeRange) {
        String currentPartOfWeek = null;
        for(Calendar range: clientTimeRange){
            int dayOfWeek = range.get(Calendar.DAY_OF_WEEK); 
            if(1 == dayOfWeek || 7 == dayOfWeek) {
                currentPartOfWeek = "weekends";
            } else {
                currentPartOfWeek = "weekdays";
            }
            Iterator<Map.Entry<Object,String>> iter = objects.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry<Object,String> entry = iter.next();

                if(currentPartOfWeek.matches(entry.getValue())){
                    continue;
                } else {
                    iter.remove();  // I need to remove the object only if true for both entries in the Calendar array  
                }
            }
        }
    }

1 Ответ

0 голосов
/ 23 мая 2018

Очевидным решением было бы изменить порядок циклов.Пусть внешний цикл повторяется по элементам Map, а внутренний цикл повторяется по массиву.Во внутреннем цикле установите для некоторого флага значение true, когда ваш currentPartOfWeek.matches(entry.getValue()) в первый раз равен false (или true, из вашего вопроса было непонятно, когда вы хотите удалить запись), и удаляйте эту запись, только еслиэтот флаг имеет значение true.

Таким образом, вы можете выполнить итерацию только один раз над Map.

. В основном это будет выглядеть так:

Iterator<Map.Entry<Object,String>> iter = objects.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<Object,String> entry = iter.next();
    boolean remove = false;
    for(Calendar range: clientTimeRange) {
        if (someCondition) {
            if (remove) {
                iter.remove();
            } else {
                remove = true;
            }
        }
    }
}

Обратите внимание, что это зависитналичие двух элементов в вашем массиве clientTimeRange.Если имеется больше элементов, вам следует соответствующим образом изменить логику (т.е. решить, когда вы хотите удалить запись - после того, как два элемента массива соответствуют текущей записи карты? После того, как все элементы массива совпадут с текущей записью?).

...