我有一个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
}
}
}
}
答案 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>