Как расположить массив объектов с одинаковым значением свойства? - PullRequest
3 голосов
/ 07 октября 2019

У меня есть модель человека с двумя свойствами, подобными этим:

int id;
String name;

и некоторый объект с этими данными:

person0 = {1,"James"};
person1 = {2,"James"};
person2 = {3,"James"};
person3 = {4,"Barbara"};
person4 = {5,"Barbara"};
person5 = {6,"Ramses"}; 

и массив содержит объекты:

firstArray = [person0, person1, person2, person3, person4, person5]; 

Следовательно, как можно получить этот массив:

secondArray = [
   [person0, person1, person2],
   [person3, person4],
   [person5]
]

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Попробуйте этот код в Java Android :

ArrayList<ArrayList<Person>> secondArr = new ArrayList<>();
        ArrayList<Course> tempArr = new ArrayList<>();
        for (int i = 0; i < firstArr.size(); i++) {
            if ((i + 1) >= firstArr.size()) {
                tempArr.add(firstArr.get(i));
                secondArr.add(tempArr);
            } else {
                if (firstArr.get(i).name .equals(  firstArr.get(i + 1).name) ) {
                    tempArr.add(firstArr.get(i));
                } else {
                    tempArr.add(firstArr.get(i));
                    secondArr.add(tempArr);
                    tempArr = new ArrayList<>();
                }
            }
        }

Наконец secondArr подготовлено.

И если список не отсортирован , мы можем использовать такой код:

for (int i = 0; i <firstArr.size() ; i++) {
  boolean isAdd = false;

  for (int j = 0; j < secondArr.size() ; j++) {
    if (secondArr.get(j).get(0).getName().equals(firstArr.get(i).getName())){
      secondArr.get(j).add(firstArr.get(i));
      isAdd =true;
      break;
    }
  }
  if (!isAdd){

    ArrayList<Person> arrayList = new ArrayList<>();
    arrayList.add(firstArr.get(i));
    secondArr.add(arrayList);

  }
}
1 голос
/ 07 октября 2019

Если язык не имеет значения.

map = new Map();    
for (persona of personas) {
  name = persona.name;
  arrayForName = map.get(name);
  if (arrayForName == null) {
    arrayForName = [];
    map.put(name, arrayForName);
  }
  arrayForName.put(persona)
}

Идея состоит в том, чтобы иметь карту (которая является ключом коллекции-> значение). Значение карты, в свою очередь, должно быть массивом.

Чтобы эффективно добавлять элементы, вы повторяете данные только один раз и добавляете массивы каждый раз, когда обнаруживается новый ключ (то есть имя).

В Java это будет что-то вроде:

Map<String, List<Persona>> map = new HashMap<>();    
for (Persona persona : personas) {
  String name = persona.getName();
  List<Persona> listForName = map.get(name);
  if (listForName == null) {
    listForName = new ArrayList<Persona>();
    map.put(name, listForName);
  }
  listForName.add(persona)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...