在List<MyObject> list = new ArrayList<>()中,我想交换两个(总是)对象的位置,这些对象在字段名称中具有相同的值。
public class SiteDTO {
private Long id;
private String name;
// getters setters constructors
}我知道最好的方法是使用Collections.swap(list, 1, 2);,其中1和2是要交换的对象的位置。
但是如何找到这些索引呢?
发布于 2019-09-23 20:40:48
您可以遍历列表的索引并找到那些相等的组,然后交换那些恰好有两个元素的组的位置:
List<SiteDTO> sites = Arrays.asList(new SiteDTO(1L, "1"), new SiteDTO(2L, "2"), new SiteDTO(3L, "1"));
Map<String, List<Integer>> groups = IntStream.range(0, sites.size()).boxed().collect(groupingBy(o -> sites.get(o).getName()));
for (List<Integer> positions : groups.values()) {
if (positions.size() == 2)
Collections.swap(sites, positions.get(0), positions.get(1));
}
System.out.println(sites);输出
[SiteDTO{id=3, name='1'}, SiteDTO{id=2, name='2'}, SiteDTO{id=1, name='1'}]注意:这适用于有多个组要交换的情况。
发布于 2019-09-23 20:32:05
通过简单地迭代该列表?
int firstIndex = -1;
int secondIndex = -1;
for (int i=0; i < yourList.size(); i++) {
if (yourList.get(i).getName().equals(whatever)) {
firstIndex = i;
break;
}然后,例如,您可以按相反的顺序进行迭代,以识别第二个索引。
当然,只有当列表中恰好有两个两个对象具有相同的属性值时,上述方法才有效。
https://stackoverflow.com/questions/58062471
复制相似问题