如何在迭代时修改除当前元素之外的所有元素

时间:2014-06-13 14:59:05

标签: java collections

我有包含标签列表的评论列表。

我想迭代我的评论列表,如果一条评论有标记DEPRECATE_OTHERS,我想在所有其他评论中添加一个DEPRECATED标记。

到目前为止,我已经能够提出一个过于混乱的解决方案,但我想知道是否有一些设施可以帮助我让它更清洁:

    for (int i = 0; i < comments.size(); i++) {
        Comment comment = comments.get(i);
        for (Tag tag : comment.getTags()) {
            if(MyEnum.DEPRECATE_OTHERS.equals(tag)) {
                for(int j = 0; j < comments.size(); j++) {
                    if(j != i) {
                        comments.get(j).getTags().add(MyEnum.DEPRECATED)
                    }
                }
            }
        }
    }

OBS:我可能有多个DEPRECATE_OTHERS,我想在这种情况下添加多个DEPRECATED标志

2 个答案:

答案 0 :(得分:2)

您可以使用一些方法来简化此代码。使用每次迭代Collection.contains()和对象相等,你可以得到它:

for (Comment comment : comments) {
    if(comment.getTags().contains(MyEnum.DEPRECATE_OTHERS))) {
        for (Comment otherComment : comments) {
            if (otherComment != comment) {
                otherComment.getTags().add(MyEnum.DEPRECATED)
            }
        }
    }
}

正如亚当所说,两次单独的迭代仍然更整洁。

答案 1 :(得分:0)

设置标记,例如deprecate_others_id = -1; 当您找到DEPRECATE_OTHERS标记时,将该变量设置为索引,并且当该var不为-1时,将每个标记设置为DEPRECATE_OTHERS。在迭代结束时,从头开始一个新循环,迭代到达deprecate_others_id,标记所有这些循环。

这会利用您当前正在迭代的事实,只会让您在启动Deprecate_Others

之前回转标记。
int deprecate_others_id = -1;
int numtags = 0;
for (int i = 0; i < comments.size(); i++) {
    Comment comment = comments.get(i);
    if(deprecate_others_id != -1){
        while(comment.getNumberofDepTags < numtags){
           comment.addTag(DEPRECATED);
        }
    }
    for (Tag tag : comment.getTags()) {
        if(MyEnum.DEPRECATE_OTHERS.equals(tag)) {
            deprecate_others_id = Math.max(deprecate_others_id,i);
        }
    }
}
if(deprecate_others_id != -1){
    for(int i=0; i<deprecate_others_id; i++){
      Comment comment = comments.get(i);
      while(comment.getNumberofDepTags < numtags){
           comment.addTag(DEPRECATED);
      }
    }
}