Collections.sort()用法簡單介紹


在開發過程中,在對list集合的排序中遇到了點小阻礙。記錄之,與君共勉。

我們先來看看,Collections.sort()的簡單用法,代碼:

package com.wh.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class Test {

    private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) {
        List<String> lists = new ArrayList<String>();
        lists.add("1");
        lists.add("5");
        lists.add("3");
        LOGGER.info("lists 排序前:" + lists.toString());
        //排序,直接調用sort方法排序,排序方式是自燃排序,即升序排序
        Collections.sort(lists);
        LOGGER.info("lists 排序后:" + lists.toString());
    }

}

運行結果:

完美排序。但是在實際開發中排序的集合遠比這個復雜,我們來看簡單的模擬。

package com.wh.bean;

import java.io.Serializable;

/**
 * Created by WH on 2016/9/17.
 */
public class TestA implements Serializable{

    private static final long serialVersionUID = -8968350748602548887L;

    private String name;

    //變量類型必須要為int的封裝類型,因為只有是封裝類型才可以調用Integer的方法
    private Integer order;

    public String getName() {
        return name;
    }

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

    public Integer getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    @Override
    public String toString() {
        return "TestA{" +
                "name='" + name + '\'' +
                ", order=" + order +
                '}';
    }
}

在調用Collections.sort()給listA排序中,編譯不通過,報錯了。這就是當時我開發中遇到的小阻礙,為什么編譯不通過呢,前面的演示中為什么可以排序呢?這是因為lists中的String本身含有compareTo方法,所以可以直接調用sort方法,所以要讓類TestA實現Comparable方法,當時參考了網上資料(這里)。解決代碼如下:

package com.wh.util;

import com.wh.bean.TestA;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class Test {

    private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) {
        List<TestA> listA = new ArrayList<TestA>();
        //TestA 即是上面類
        TestA a1 = new TestA();
        a1.setName("張大胖");
        a1.setOrder(1);
        listA.add(a1);
        TestA a5 = new TestA();
        a5.setName("王曉梅");
        a5.setOrder(5);
        listA.add(a5);
        TestA a3 = new TestA();
        a3.setName("劉曉彤");
        a3.setOrder(3);
        listA.add(a3);
        LOGGER.info("listA 排序前:" + listA.toString());
        Collections.sort(listA, new Comparator<TestA>() {
            @Override
            public int compare(TestA o1, TestA o2) {
                //升序
                return o1.getOrder().compareTo(o2.getOrder());
            }
        });
        LOGGER.info("listB 升序排序后:" +listA.toString());
        Collections.sort(listA, new Comparator<TestA>() {
            @Override
            public int compare(TestA o1, TestA o2) {
                //降序
                return o2.getOrder().compareTo(o1.getOrder());
            }
        });
        LOGGER.info("listB 降序排序后:" +listA.toString());
    }

}

運行結果:

這里可以實現降序和升序排序。除了這個解決方法還有另外一個解決方法:

package com.wh.bean;

import java.io.Serializable;

/**
 * Created by WH on 2016/9/17.
 */
//實現Comparable
public class TestB implements Serializable, Comparable<TestB> {

    private static final long serialVersionUID = -2872189514594810657L;

    private String name;

    private Integer order;

    public String getName() {
        return name;
    }

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

    public int getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }
  
    @Override
    public int compareTo(TestB o) {
     //升序
return this.order.compareTo(o.getOrder()); } @Override public String toString() { return "TestB{" + "name='" + name + '\'' + ", order=" + order + '}'; } }

 

 

package com.wh.bean;

import java.io.Serializable;

/**
 * Created by WH on 2016/9/17.
 */
public class TestB implements Serializable, Comparable<TestB> {

    private static final long serialVersionUID = -2872189514594810657L;

    private String name;

    private Integer order;

    public String getName() {
        return name;
    }

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

    public int getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }

    @Override
    public int compareTo(TestB o) {
        return this.order.compareTo(o.getOrder());
    }

    @Override
    public String toString() {
        return "TestB{" +
                "name='" + name + '\'' +
                ", order=" + order +
                '}';
    }
}

運行結果:

就這樣解決了問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM