如何使用字符串降序对arrayList进行排序

时间:2017-01-12 09:30:14

标签: java sorting arraylist

我正在获取json数据:

[
  {
    "name": "A",
    "count": "2"
  },
  {
    "name": "B",
    "count": "1"
  },
  {
    "name": "A",
    "count": "3"
  },
  {
    "name": "C",
    "count": "10"
  },
  {
    "name": "B",
    "count": "2"
  }
]

所以我使用for循环迭代数据,正常的东西。但我想最终得到arraylist这样的结果:

C - &大于7

A - →5

乙 - →3

请注意list从最高到最低排序。 我到目前为止所尝试的是:

//create my arraylists
    //has both name and count
     ArrayList<String>namesWithCountList = new ArrayList<>();
     //has only names 
     ArrayList<String>namesList = new ArrayList<>();

    //get json array..
    //iterate using for loop
     for (int i = 0; i < myJsonArray.length(); i++) {
      String nameStr = jsonObj.getString("name");
      int count = jsonObj.getInt("count");

      index = namesList.indexOf(name);//get index of the name

        if (index < 0) {
        // name doesnt exist in namesList, so we add it
       namesList.add(nameStr);
       namesWithCountList.add(nameStr+"-->"+count);
       }else{
        //name exists so we only add the count to existing list
       }

     }

我知道我应该使用Comparator.sort(),但我不知道如何将list放在那里,因为我将名称和计数混合在一起,如:C-->7

我一直在强调逻辑应该是什么样的,对此有何帮助?

3 个答案:

答案 0 :(得分:6)

你正在得到你的心理&#34;模特错了。

如果你的对象有一个名字和一个计数,那么只需不要将它们推送到像

这样的字符串中
"name-->count"

相反:创建包含这些属性的自己的自定义类。然后你可以为那个类创建一个(某种程度上)更简单的比较器。如果您打算在某些时候执行此操作,这也简化了写回JSON数据的过程。

如果你坚持继续使用破碎的方法,那么你必须创建一个知道如何对这种类型的字符串进行排序的比较器。换句话说:你的比较者必须分割这样的&#34; n - &gt; c&#34;串;并从中推断出名称和数量;然后做好自己的工作。但正如所说;你最好放弃这个想法。

严肃地说:这是超级糟糕的做法。 Java是一种强类型语言;并且编码多个值到一个扁平字符串中完全从&#34; help&#34;中放弃自己Java类型系统为您提供的。

答案 1 :(得分:2)

让我们创建一个实体类来保存您的namecount映射

import java.util.Comparator;

public class Entity implements Comparable {
private String name;
private int count;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getCount() {
    return count;
}

public void setCount(int count) {
    this.count = count;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + count;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Entity other = (Entity) obj;
    if (count != other.count)
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}

public static Comparator<Entity> ArraylistComparator = new Comparator<Entity>() {

    public int compare(Entity e1, Entity e2) {
        int count1 = e1.getCount();
        int count2 = e2.getCount();

        // ascending order
        return e1.compareTo(e2);

    }
};

@Override
public int compareTo(Object o) {
    int compareCount = ((Entity) o).getCount();
    /* For Ascending order */
    return this.count - compareCount;

    /* For Descending order do like this */
    // return compareCount - this.count;
}

@Override
public String toString() {
    return "Entity [name=" + name + ", count=" + count + "]";
}

}

然后让我们在单独的类中创建一个方法来填充arrayList并调用comparator

import java.util.ArrayList;
import java.util.Collections;

public class ArraySort {

public static void main(String[] args) {
    ArrayList<Entity> arrayList = new ArrayList<Entity>();

    Entity entity1 = new Entity();
    entity1.setCount(2);
    entity1.setName("D");

    Entity entity2 = new Entity();
    entity2.setCount(10);
    entity2.setName("A");

    Entity entity3 = new Entity();
    entity3.setCount(5);
    entity3.setName("C");

    arrayList.add(entity1);
    arrayList.add(entity2);
    arrayList.add(entity3);

    System.out.println("Entity Count Sorting:");
    Collections.sort(arrayList, Entity.ArraylistComparator);

    for (Entity ent : arrayList) {
        System.out.println(ent);
    }
}

}

输出:

实体[name = D,count = 2]

实体[name = C,count = 5]

实体[name = A,count = 10]

希望这有帮助!

答案 2 :(得分:1)

如果你想要总结所有&#34; A&#34;,所有&#34; B&#34;等等以下代码可能有所帮助。它使用Java 8和Lombok库(用于生成样板代码):

@NoArgsConstructor
@AllArgsConstructor
@Data
class Entity {
    private String name;
    private int count;
}

public class Main {

    public static void main(String[] args) {
        List<Entity> list = Arrays.asList(
                new Entity("A", 2),
                new Entity("B", 1),
                new Entity("A", 3),
                new Entity("C", 10),
                new Entity("B", 2));

        Map<String, Integer> grouped =
                list.stream().collect(Collectors.groupingBy(Entity::getName, Collectors.summingInt(Entity::getCount)));
        System.out.println(grouped);
    }
}

结果:

{A=5, B=3, C=10}