[英]How to sort custom arraylist by object value integer
我有一個名為想法的 ArrayList:
public ArrayList<Idea> ideas = new ArrayList<Idea>();
在想法類中,我有一個名為 id 的私有整數值。
private long id;
public long getId() {return id;}
您將如何按升序和降序對 ArrayList 進行排序?
您可以使用Collections.sort(list,comparator) 。 使用這種方法,您不需要編輯您的Idea
類。
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());
根據您的代碼在下面給出了排序 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);
}
});
}
}
想法.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]]
如果您使用帶有方法指針的 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
有問題。
您必須創建自己的比較器。 將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.sort(list, Collections.reverseOrder());
另請注意,即使您想比較long
, compareTo()
方法也會返回int
。 這就是為什么你必須使用Long.compare(...)
。
有兩種方法。 您可以實現自定義Comparator
,也可以讓Idea
實現Comparable<Idea>
接口。 但您必須小心:由於id
的類型為long
,因此您不能按照其他答案的建議使用減法。 compare()
和compareTo()
方法返回一個int
,但減去id
產生一個long
。 相反,您必須使用(不太簡潔的)關系操作(例如>
、 <
、 ==
)來比較id
。您可以通過以下方式完成此操作:
方法一:
在 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)
}
});
方法二:
讓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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.