首頁 > Java > java教程 > 主體

Java線性表的排序

黄舟
發布: 2017-02-22 10:01:45
原創
1732 人瀏覽過

Java線性表的排序

前言:剛才在弄JDBC的時候,忽然覺得order-by用太多了沒新鮮感,我的第六感告訴我java有對線性表排序的封裝,然後在eclipse裡隨便按了一下「.」 ,哈哈,竟然真有這麼靜態方法public static void sort(List list, Comparator c)。

修改記錄:根據@mythabc的的建議,增加了另一種方式。


方式一:Comparator比較器

好處:這種方式運作的時候比較靈活,如果要更換排序規則,不更改原有的比較器,而直接新建另一個比較器,在客戶端換一下比較器的新類名就行了,這樣比較貼近開閉原則,當累積了多個比較器後,各種排序規則可以隨意轉換,挺爽的;模型與排序分離,比較貼近單一職責原則。

1.先定義一個模型:

package model;

/**
 * User.java
 * 
 * @author 梁WP 2014年3月3日
 */
public class User
{
    private String userName;
    private int userAge;
    
    public User()
    {
    }
    
    public User(String userName, int userAge)
    {
        this.userName = userName;
        this.userAge = userAge;
    }

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String userName)
    {
        this.userName = userName;
    }

    public int getUserAge()
    {
        return userAge;
    }

    public void setUserAge(int userAge)
    {
        this.userAge = userAge;
    }
}
登入後複製





#2.然後定義一個比較器,實作java.util .Comparator接口,在compare()方法寫比較規則:

package util;

import java.util.Comparator;

import model.User;

/**
 * ComparatorUser.java
 * 
 * @author 梁WP 2014年3月3日
 */
public class ComparatorUser implements Comparator<User>
{
    @Override
    public int compare(User arg0, User arg1)
    {
        // 先比较名字
        int flag = arg0.getUserName().compareTo(arg1.getUserName());

        // 如果名字一样,就比较年龄
        if (flag == 0)
        {
            return arg0.getUserAge() - arg1.getUserAge();
        }
        return flag;
    }
}
登入後複製





3.排序的時候用java.util.Collections裡面的sort(List list, Comparator c)方法:

package test;

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

import util.ComparatorUser;
import model.User;

/**
 * TestApp.java
 * 
 * @author 梁WP 2014年3月3日
 */
public class TestApp
{
    public static void main(String[] arg0)
    {
        List<User> userList = new ArrayList<User>();

        // 插入数据
        userList.add(new User("A", 15));
        userList.add(new User("B", 14));
        userList.add(new User("A", 14));

        // 排序
        Collections.sort(userList, new ComparatorUser());

        // 打印结果
        for (User u : userList)
        {
            System.out.println(u.getUserName() + " " + u.getUserAge());
        }
    }
}
登入後複製


4.運行結果:

##

A 14
A 15
B 14
登入後複製
登入後複製


#方式二:實作Comparable介面
好處:直接讓模型附帶可排序的屬性,不用去定義新的類別(不用定義比較器),減少了類別的數量,方便管理,閱讀的時候比較輕鬆。

1.先定義一個模型,並實作Comparable接口,在compareTo()方法寫比較規則:


package model;

/**
 * Student.java
 * 
 * @author 梁WP 2014年3月4日
 */
public class Student implements Comparable<Student>
{
    private String studentName;
    private int studentAge;

    public Student()
    {
    }
    
    public Student(String studentName, int studentAge)
    {
        this.studentName = studentName;
        this.studentAge = studentAge;
    }

    public String getStudentName()
    {
        return studentName;
    }

    public void setStudentName(String studentName)
    {
        this.studentName = studentName;
    }

    public int getStudentAge()
    {
        return studentAge;
    }

    public void setStudentAge(int studentAge)
    {
        this.studentAge = studentAge;
    }

    @Override
    public int compareTo(Student o)
    {
        // 先比较名字
        int flag = this.getStudentName().compareTo(o.getStudentName());

        // 如果名字一样,就比较年龄
        if (flag == 0)
        {
            return this.getStudentAge() - o.getStudentAge();
        }
        return flag;
    }
}
登入後複製

2.排序的時候用java .util.Collections裡面的sort(List list)方法:


package test;

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

import model.Student;

/**
 * TestApp.java
 * 
 * @author 梁WP 2014年3月4日
 */
public class TestApp2
{
    public static void main(String[] arg0)
    {
        List<Student> studentList = new ArrayList<Student>();

        // 插入数据
        studentList.add(new Student("A", 15));
        studentList.add(new Student("B", 14));
        studentList.add(new Student("A", 14));

        // 排序
        Collections.sort(studentList);

        // 打印结果
        for (Student s : studentList)
        {
            System.out.println(s.getStudentName() + " " + s.getStudentAge());
        }
    }
}
登入後複製

3.運行結果:

A 14
A 15
B 14
登入後複製
登入後複製
           

######
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!