如何排列具有相同属性值的对象数组?

时间:2019-10-07 10:03:20

标签: algorithm sorting

我有一个具有以下两个属性的人模型

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 个答案:

答案 0 :(得分:1)

语言无关紧要。

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)
}

答案 1 :(得分:1)

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);

  }
}