我有一个名为ideas的
public ArrayList<Idea> ideas = new ArrayList<Idea>();
在ideas类中,我有一个名为id的私有整数值。
private long id;
public long getId() {return id;}
您如何按升序和降序值对ArrayList进行排序?
答案 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);
}
}