首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数组列表中交换具有相同值的两个对象的位置

问如何在数组列表中交换具有相同值的两个对象的位置
EN

Stack Overflow用户
提问于 2019-09-23 20:29:13
回答 2查看 285关注 0票数 0

在List<MyObject> list = new ArrayList<>()中,我想交换两个(总是)对象的位置,这些对象在字段名称中具有相同的值。

代码语言:javascript
复制
public class SiteDTO {
   private Long id;
   private String name;

// getters setters constructors

}

我知道最好的方法是使用Collections.swap(list, 1, 2);,其中1和2是要交换的对象的位置。

但是如何找到这些索引呢?

EN

回答 2

Stack Overflow用户

发布于 2019-09-23 20:40:48

您可以遍历列表的索引并找到那些相等的组,然后交换那些恰好有两个元素的组的位置:

代码语言:javascript
复制
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);

输出

代码语言:javascript
复制
[SiteDTO{id=3, name='1'}, SiteDTO{id=2, name='2'}, SiteDTO{id=1, name='1'}]

注意:这适用于有多个组要交换的情况。

票数 1
EN

Stack Overflow用户

发布于 2019-09-23 20:32:05

通过简单地迭代该列表?

代码语言:javascript
复制
int firstIndex = -1;
int secondIndex = -1;

for (int i=0; i < yourList.size(); i++) {
  if (yourList.get(i).getName().equals(whatever)) {
    firstIndex = i;
    break;
  }

然后,例如,您可以按相反的顺序进行迭代,以识别第二个索引。

当然,只有当列表中恰好有两个两个对象具有相同的属性值时,上述方法才有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58062471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档