在决定是否删除对象之前,Java会迭代映射两次

时间:2018-05-23 10:17:32

标签: java iterator

我有一个Object字符串的地图。 在决定是否删除之前,我需要迭代两次。

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 :(得分:1)

显而易见的解决方案是颠倒循环的顺序。让外部循环遍历Map条目,内部循环遍历数组。在内部循环中,在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数组中包含两个元素。如果有更多元素,你应该相应地调整逻辑(即决定何时删除条目 - 在数组的两个元素与当前Map条目匹配后?在数组的所有元素与当前条目匹配后?)。 / p>