Как поменять положение двух объектов с одинаковыми значениями в списке массивов - PullRequest
0 голосов
/ 23 сентября 2019

В List<MyObject> list = new ArrayList<>() я хочу поменять местами два (всегда) объекта, которые имеют одинаковое значение в имени поля.

public class SiteDTO {
   private Long id;
   private String name;

// getters setters constructors

}

я знаю, что лучший способ сделать это - использовать Collections.swap(list, 1, 2);, где1 и 2 - позиции объектов для обмена.

Но как найти эти индексы?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы можете перебрать индексы списка и найти те группы, которые равны, а затем поменять местами те, которые имеют ровно два элемента:

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'}]

Примечание: Это работает в том случае, если у вас есть несколько групп для обмена.

0 голосов
/ 23 сентября 2019

Путем простой итерации этого списка?

int firstIndex = -1;
int secondIndex = -1;

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

И затем вы можете, например, просто выполнить итерацию в обратном порядке для определения второго индекса.

Конечно, вышеописанное работает только тогда, когда естьровно два объекта, которые имеют одинаковое значение свойства в вашем списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...