Java 在遍历集合时对其进行排序

Java 在遍历集合时对其进行排序,java,Java,我想循环遍历对象的ArrayList,它按对象的一个属性排序,该属性是一个整数(带有Collections.sort())。如果满足某个条件,我想通过添加+60来修改该属性。现在,我想利用我的收藏,希望我能以更大的索引再次访问同一个对象 考虑到我在对新的ArrayList进行排序时遍历它,这有意义吗 ArrayList<Object> list = new ArrayList<>(); Collection.sort(list, Comparator.comparing(

我想循环遍历对象的ArrayList,它按对象的一个属性排序,该属性是一个整数(带有Collections.sort())。如果满足某个条件,我想通过添加+60来修改该属性。现在,我想利用我的收藏,希望我能以更大的索引再次访问同一个对象

考虑到我在对新的ArrayList进行排序时遍历它,这有意义吗

ArrayList<Object> list = new ArrayList<>();
Collection.sort(list, Comparator.comparing(Order::getInt);

for (int i = 0; i < list.size(); i++) {
   Object dummy = list.get(i);

   if (dummy < 8) {
      dummy.setInt(8+60);
      Collection.sort(list, Comparator.comparing(Order::getInt);
   }
}
ArrayList list=new ArrayList();
Collection.sort(list,Comparator.comparing)(Order::getInt);
对于(int i=0;i
更高效、更简单的方法是先应用操作,然后在最后进行排序:

ArrayList<Object> list = new ArrayList<>();

for (Object dummy : list) {
   if (dummy < 8) {
      dummy.setInt(8+60);
   }
}
Collection.sort(list, Comparator.comparing(Order::getInt);
ArrayList list=new ArrayList();
对于(对象虚拟:列表){
如果(虚拟<8){
虚拟设置(8+60);
}
}
Collection.sort(list,Comparator.comparing)(Order::getInt);
此外,在您最初的方法中,您在列表中进行迭代,然后通过排序对其进行更改,这几乎总是一个不好的主意。因此,这可能会导致您跳过对象的情况,因为在排序阶段之后,这些对象可能会落在您当前使用的索引之下。

对于这种情况已经足够了,因为只有在更新元素之前,您的标准才会为真:
8+60>=8
,因此您不需要再次更新它

但是,如果元素有可能需要再次更新,您可以这样继续:

因为列表已经排序,所以不需要重新排序:只需找到新的插入位置,在那里添加项目,然后将其从旧位置删除即可

如何找到新位置取决于您:您可以线性搜索、二进制搜索等

然后,您只需确保再次处理相同的
i
,因为您需要处理您移动的元素之后的元素

for (int i = 0; i < list.size(); i++) {
   Dummy dummy = list.get(i);

   if (condition(dummy)) {
      int newIndex = /* however you like */
      update(dummy);
      list.add(newIndex, dummy);
      list.remove(i);
      --i;
   }
}
或者你也可以使用:

Collections.rotate(list.subList(i, newIndex), 1);
这可能更有效的原因是它避免了将未受影响的元素移动两次:在
newIndex
处添加某个元素意味着您必须将所有后续元素移动一次;在
i
处删除某个元素意味着您必须将所有后续元素移动一次

Collections.rotate(list.subList(i, newIndex), 1);