簡體   English   中英

如何按對象值整數對自定義數組列表進行排序

[英]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());

另請注意,即使您想比較longcompareTo()方法也會返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM