Java中ArrayList 元素的排序

ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减。

<一> 排序字符串的ArrayList

ArrayList中存储的是String类型的数据,在对这个 ArrayList 进行排序,你需要调用 Collections.sort()方法,看一段示例代码:

package com.sort.pack;

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

public class SortArrayListAscDes {
    private ArrayList arrayList;

    public SortArrayListAscDes(ArrayList arrayList) {
        this.arrayList = arrayList;
    }

    public ArrayList getArrayList() {
        return arrayList;
    }

    public ArrayList sortAscending(){                 //升序排序方法
         Collections.sort(this.arrayList);
        return this.arrayList;
    }

    public ArrayList sortDescending(){                //降序排序方法
        Collections.sort(this.arrayList,Collections.reverseOrder());
        return this.arrayList;
    }
}

test类:

package com.sort.pack;

import java.util.ArrayList;

public class SortArrayListAscDecTest {
    public static void main(String[] args) {

        ArrayList stringArrayListist = new ArrayList<>();
        stringArrayListist.add("Itlay");
        stringArrayListist.add("China");
        stringArrayListist.add("America");
        stringArrayListist.add("Russian");

        SortArrayListAscDes sortArrayListAscDes = new SortArrayListAscDes(stringArrayListist);
        System.out.println("没有经过排序的数组: "+stringArrayListist);

        System.out.println("升序排序: "+ sortArrayListAscDes.sortAscending());
        System.out.println("降序排序: "+ sortArrayListAscDes.sortDescending());
    }
}
  • 在 sortDescending()方法中,我们调用重载的 Collections.sort()方法让其按照降序对元素排序,这个版本的 Collections.sort()接收ArrayList对象作为第一个参数,一个由 Collections.reverseOrder()方法返回的 Comparator 对象作为第二个参数。
  • reverseOrder //逆序的意思

Collections.sort() 方法对 ArrayList 的元素或者任何其他 List 的实现提供的可比较的元素进行排序,这意味着这些元素的类需要实现 java.lang 包中的 Comparable 接口。正如 String 类实现了 Comparable 接口, Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File 和 Date 类也都实现了 Comparable 接口.

<二>使用Comparable排序ArrayList

Comparable 是带有单一 compareTo()方法的接口。一个实现了 Comparable 接口的类对象可以与其它同类型的对象进行比较,实现 Comparable 接口的类需要重写 compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。可以看一段示例代码:

package com.objectfile.writeread;
import java.io.Serializable;

public class Student implements Comparable<Student>,Serializable{
    private String name;
    private String number;
    private float score1;
    private float score2;
    private float score3;
    private float totlescore;

    public Student() {
    }

    public Student(String name, String number, float score1, float score2, float score3) {
        this.name = name;
        this.number = number;
        this.score1 = score1;
        this.score2 = score2;
        this.score3 = score3;
        this.totlescore = score1 + score2 + score3;
    }

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public float getScore1() {
        return score1;
    }

    public void setScore1(float score1) {
        this.score1 = score1;
    }

    public float getScore2() {
        return score2;
    }

    public void setScore2(float score2) {
        this.score2 = score2;
    }

    public float getScore3() {
        return score3;
    }

    public void setScore3(float score3) {
        this.score3 = score3;
    }

    public float getTotlescore() {
        return totlescore;
    }
    public void setTotlescore(float totlescore){
        this.totlescore = totlescore;
    }

    @Override
    public String toString() {
        return "name: "+this.getName()+" number: "+this.getNumber()+" score1: "+this.getScore1()+" score2: "+this.getScore2()+" score3: "+this.getScore3()+" totlescore:"+this.getTotlescore();
    }

  //按学生总分的降序排列
    @Override
    public int compareTo(Student o) {
        return (this.totlescore > o.totlescore ? -1 : (this.totlescore == o.totlescore ? 0 : 1));
    }
}
public class saveStudent {
    public List<Student> sortStudent(List<Student> sortlist){
        Collections.sort(sortlist);
        return sortlist;
    }
}

test类:

public class testObjectFile {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        for (int i = 1; i < 6; i++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入第 "+i+" 个同学的姓名:");
            String name = sc.nextLine();
            System.out.println("请输入你的学号:");
            String number = sc.nextLine();
            System.out.println("请输入你的成绩1:");
            float score1 = sc.nextFloat();
            System.out.println("请输入你的成绩2:");
            float score2 = sc.nextFloat();
            System.out.println("请输入你的成绩3:");
            float score3 = sc.nextFloat();
            Student stu = new Student(name,number,score1,score2,score3);
            list.add(stu);
        }

        saveStudent student = new saveStudent();
        list = student.sortStudent(list);  //先对所有的学生成绩进行排名

这种方式你将只能基于一个成员变量(例如上面的例子就是基于学生信息的总分)来对象的比较。

<三>使用 Comparator 排序 ArrayList

Comparator 接口与Comparable 接口相似也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo()方法不同的是,这个 compare()接受两个同类型的不同对象进行比较。

package guru.springframework.blog.sortarraylist.comparator;
 import java.util.Comparator;

 public class JobCandidate {
     private String name;
     private String gender;
     private int age;
     public JobCandidate(String name, String gender, int age) {
         this.name = name;
         this.gender = gender;
         this.age = age;
     }
     public String getName() {
         return name;
     }
     public String getGender() {
         return gender;
     }
     public int getAge() {
         return age;
     }
     //匿名内部类
     public static Comparator ageComparator = new Comparator() {
     @Override
     public int compare(JobCandidate jc1, JobCandidate jc2) {
     return (jc2.getAge() < jc1.getAge() ? -1 :(jc2.getAge() == jc1.getAge() ? 0 : 1));
     }
 };
     public static Comparator nameComparator = new Comparator() {
     @Override
     public int compare(JobCandidate jc1, JobCandidate jc2) {
         return (int) (jc1.getName().compareTo(jc2.getName()));
     }
 };
     @Override
     public String toString() {
         return " Name: " + this.name + ", Gender: " + this.gender + ", age:" + this.age;
     }
 }

一个匿名类并实现了 compare()方法,按照年龄的降序对 JobCandidate 对象进行排序。从37行到42行,我们又写了一个匿名类并实现了 compare() 方法,按照姓名的升序对 JobCandidate进行排序。现在我们写一个类,为委托方对 ArrayList 的元素进行排序。

package guru.springframework.blog.sortarraylist.comparator;
 import java.util.ArrayList;
 import java.util.Collections;
 public class JobCandidateSorter {
 ArrayList jobCandidate = new ArrayList<>();
     public JobCandidateSorter(ArrayList jobCandidate) {
         this.jobCandidate = jobCandidate;
     }
     public ArrayList getSortedJobCandidateByAge() {
         Collections.sort(jobCandidate, JobCandidate.ageComparator);
         return jobCandidate;
     }
     public ArrayList getSortedJobCandidateByName() {
         Collections.sort(jobCandidate, JobCandidate.nameComparator);
     return jobCandidate;
     }
 }

getSortedJobCandidateByAge()方法,在这个方法内部我们调用了 Collections.sort()的重载版本,这个版本传递要被排序的 ArrayList 对象和比较年龄的 Comparator 对象。在 getSortedJobCandidateByName()方法内部,我们又调用了 Collections.sort()的另一个重载版本,这个版本传递要被排序的 ArrayList 对象和比较姓名的 Comparator 对象。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值