如何按对象值整数对自定义arraylist进行排序

时间:2016-03-08 16:08:46

标签: java android list sorting arraylist

我有一个名为ideas的

public ArrayList<Idea> ideas = new ArrayList<Idea>();

在ideas类中,我有一个名为id的私有整数值。

private long id;
public long getId() {return id;}

您如何按升序和降序值对ArrayList进行排序?

5 个答案:

答案 0 :(得分:4)

排序ArrayList示例在下面根据您的代码

给出

<强> SortIdeaExample.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortIdeaExample {

    public static void main(String[] args) {
        List<Idea> ideaList = new ArrayList<Idea>();
        ideaList.add(new Idea(11l));
        ideaList.add(new Idea(2l));
        ideaList.add(new Idea(13l));
        ideaList.add(new Idea(4l));

        SortIdeaExample sortExample = new SortIdeaExample();
        System.out.println("Before sorting:" + ideaList);
        sortExample.sortList(ideaList);
        System.out.println("Ascending sorted list:" + ideaList);
        sortExample.sortListReverse(ideaList);
        System.out.println("Descending sorted list:" + ideaList);
    }

    private void sortList(List<Idea> list) {
        Collections.sort(list, new Comparator<Idea>() {
            public int compare(Idea ideaVal1, Idea ideaVal2) {
                // avoiding NullPointerException in case name is null
                Long idea1 = new Long(ideaVal1.getId());
                Long idea2 = new Long(ideaVal2.getId());
                return idea1.compareTo(idea2);
            }
        });
    }

    private void sortListReverse(List<Idea> list) {
        Collections.sort(list, new Comparator<Idea>() {
            public int compare(Idea ideaVal1, Idea ideaVal2) {
                // avoiding NullPointerException in case name is null
                Long idea1 = new Long(ideaVal1.getId());
                Long idea2 = new Long(ideaVal2.getId());
                return idea2.compareTo(idea1);
            }
        });
    }
}

<强> Idea.java

public class Idea {
    private long id;

    public Idea(long id) {
        super();
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Idea [id=" + id + "]";
    }
}

<强>输出:

Before sorting:[Idea [id=11], Idea [id=2], Idea [id=13], Idea [id=4]]
Ascending sorted list:[Idea [id=2], Idea [id=4], Idea [id=11], Idea [id=13]]
Descending sorted list:[Idea [id=13], Idea [id=11], Idea [id=4], Idea [id=2]]

答案 1 :(得分:2)

您可以使用Collections.sort(list, comparator)。使用此方法,您无需编辑Collections.sort(ideas, new Comparator<Ideas>() { public int compare(Idea i1, Idea i2) { return i1 - i2; } }); 类。

Collections.sort(ideas, (new Comparator<Ideas>() {
    public int compare(Idea i1, Idea i2) {
        return i1 - i2;
    }
}).reverseOrder());

要使用rever订单,您可以使用:

client.back()

答案 2 :(得分:2)

如果您使用带有方法指针的Java 8,则可以非常轻松地完成此操作。这样的事情可以解决问题:

ArrayList<Idea> ideas = new ArrayList<Idea>();
ideas.sort(Comparator.comparing(Idea::getId));
ideas.sort(Comparator.comparing(Idea::getId).reversed());

如果您不使用Java 8,我会使用其他答案中提到的匿名类。

编辑 - 适用于long。我看到其他答案与long有问题。

答案 3 :(得分:1)

您必须创建自己的比较器。将Comparable课程实施到您的Idea课程。然后覆盖compareTo()方法。它看起来像这样:

public class Idea implements Comparable<Idea> {

   // Variables, constructor, getters, setters ...

   @Override
   public int compareTo(Idea other) {
      return Long.compare(this.getId(), other.getId());
   }
}

最后按Collections.sort(list);

排序

如果您想要反向结果,请执行以下操作:Collections.sort(list, Collections.reverseOrder());

另请注意,即使您想要比较compareTo()int方法也会返回long。这就是您必须使用Long.compare(...)

的原因

答案 4 :(得分:1)

有两种方法。您可以实现自定义Comparator,也可以Idea实施Comparable<Idea>界面。但是你必须要小心:由于id的类型为long,因此您无法使用其他答案所建议的减法。 compare()compareTo()方法返回int,但减去id s会产生long。相反,您必须使用(不太简洁的)关系操作(例如id><来比较==。以下是如何完成此操作:

方法1:

在Java 8中:由于Comparator是功能接口,您可以将lambda表达式传递给ideas.sort()方法,如下所示:

ideas.sort((i1,i2)->(i1.getId() < i2.getId()) ? -1 : ((i1.getId() == i2.getId()) ? 0 : 1));

在Java 8之前:如果您使用的是Java 8之前的版本,则使用匿名Comparator

ideas.sort(new Comparator<Idea>(){

    @Override
    public int compare(Idea i1, Idea i2) {
        (i1 < i2) ? -1 : ((i1 == i2) ? 0 : 1)
    }

});

方法2:

Idea类实现Comparable<Idea>接口:

public class Idea implements Comparable<Idea>{
    private long id;

    public long getId(){
        return id;
    }

    @Override
    public int compareTo(Idea o) {
        (id < o.id) ? -1 : ((id == o.id) ? 0 : 1);
    }

}