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

Java 迭代时如何修改除当前元素以外的所有元素,java,collections,Java,Collections,我有一个包含标签列表的评论列表 我想迭代我的注释列表,如果一条注释有一个标记DEPRECATE\u OTHERS,我想在所有其他注释中添加一个标记DEPRECATED 到目前为止,我已经能够提出一个过于混乱的解决方案,但我想知道是否有一些设施可以帮助我使其更干净: for (int i = 0; i < comments.size(); i++) { Comment comment = comments.get(i); for (Tag tag :

我有一个包含标签列表的评论列表

我想迭代我的注释列表,如果一条注释有一个标记DEPRECATE\u 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)
                    }
                }
            }
        }
    }
for(int i=0;i

OBS:我可能有多个不推荐的其他人,我想在这种情况下添加多个不推荐的标志

设置一个标志,类似于
不推荐的其他人id=-1
当您找到一个DEPRECATE_OTHERS标记时,将该变量设置为索引,并且当该变量不是-1时,将每个标记设置为DEPRECATE_OTHERS。在迭代结束时,从一开始就开始一个新的循环,该循环一直迭代到
deprecate\u others\u id
,标记所有这些循环

这利用了您当前仍在迭代的事实,只使您在启动
弃用其他

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);
      }
    }
}
int deprecate\u others\u id=-1;
int numtags=0;
对于(int i=0;i对于(int i=0;i有几种方法可用于简化此代码。对于每次迭代,
Collection.contains()
和object equality,您可以将其归结为:

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

正如Adam所说,两个单独的迭代会更整洁。

同意,我已经考虑过了,问题是我可能有多个不推荐的标记,在这种情况下,我想添加多个不推荐的标记。(我的标记结构比字符串更复杂)。但是,如果要在其他每条注释中添加不推荐的注释,则此操作仍然有效。只需存储
Math.max()
的id和要添加的
弃用标记的数量。在第二个循环中,迭代到max id,添加标记,直到每个注释都有
numtags
弃用标记的数量。我现在不确定我是否理解。假设两个注释有
弃用的\u其他
。是否所有其他注释都有两个
弃用的
>标记,这些标记各有一个?或者具有
DEPRECATED\u OTHERS
的注释不应该具有
DEPRECATED
标记?对于我找到的每个DEPRECATED\u OTHERS,我必须在所有其他标记中添加一个DEPRECATED。原因是我的标记类型比我在练习中描述的更复杂。如果有两个注释(a,B)是否有不推荐的标记?他们是否有不推荐的标记?(因为不推荐的标记会使B不推荐,B到A也是如此)听起来我的答案可能会奏效。是的,马可,你说得对。你的答案看起来好得多,所以我要投赞成票。我唯一的理由是,在最好的情况下,复杂度,第一条评论有deprecate others标签,这是唯一的一条。在这种情况下,只需要一次完整的迭代。