我有包含标签列表的评论列表。
我想迭代我的评论列表,如果一条评论有标记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标志
答案 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);
}
}
}