Java针对ArrayList自定义排序的2种实现方法

这里给出针对ArrayList自定义排序的两种方法的详细攻略,分别为使用Comparator接口和使用Comparable接口。

1.使用Comparator接口

Comparator接口是JAVA中的一个接口, 我们可以在其中实现自定义的一些比较规则, 然后使用这些规则去对一些数据进行排序。

接下来是这种方式的实现步骤:

第一步:定义比较规则

我们需要实现Comparator接口,实现其中的compare方法,例如:

public class MyComparator implements Comparator<Integer>{
    public int compare(Integer i1, Integer i2){
        return i1 - i2;
    }
}

以上代码中,MyComparator类实现了Comparator接口,也定义了compare方法。我们在该方法中比较了两个整数i1和i2,将它们相减并返回。这表示如果i1大于i2,则返回一个正数;如果i1小于i2,则返回一个负数;如果i1等于i2,则返回零。在这里,我们按升序排序。

第二步:使用Comparator进行排序

现在我们已经实现了比较规则,我们需要将这个规则应用到我们的数据中,以便对数据进行排序。

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(1);
list.add(3);
Collections.sort(list, new MyComparator());

以上代码中,我们创建了一个ArrayList,添加了3个整数。然后我们调用了Collections.sort()方法,该方法接受两个参数,第一个参数是要排序的数据,这里是我们创建的ArrayList。第二个参数是我们实现的比较规则,这里是MyComparator类的一个实例。

最后,当我们打印出ArrayList中的所有元素时,我们将会看到已经按照我们的规则升序排列。

示例1

接下来,我们将演示一个更具体的示例。

我们创建一个名称为Person的类,含有两个字段,分别为名字和年龄。现在我们想按照年龄升序对Person对象进行排序。

class Person {
    private String name;
    private int age;
    public Person(String name,int age) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name
    }
}

class PersonAgeComparator implements Comparator<Person> {
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

// 使用这个比较器排序
ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person("Bob", 25));
persons.add(new Person("Alice", 18));
Collections.sort(persons, new PersonAgeComparator());

在此示例中,我们创建了一个名为Person的类和一个名为PersonAgeComparator的比较器类。该比较器实现了Comparator接口,并实现了compare方法,该方法比较了两个Person对象的年龄并返回它们之间的差值。

最后,我们创建了一个ArrayList对象,并添加了两个Person对象。我们使用Collections.sort()方法按照Person对象的年龄升序对这个ArrayList进行排序。最后,我们将分别获取排序后的Person列表中的第一个名称,以验证排序是否成功。

2.使用Comparable接口

除了使用Comparator接口对集合进行排序之外,我们还可以使用实现了Comparable接口的数据类型来对集合进行排序。实现Comparable接口的数据类型可以直接使用Collections.sort()方法进行升序排列。

当我们实现了Comparable接口时,我们需要提供一个compareTo()方法,该方法将定义我们的数据类型与其他类型的比较规则。

第一步:定义比较规则

下面是一个实现了Comparable接口的Person类及其compareTo()方法的示例:

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Person p) {
        return this.getAge() - p.getAge();
    }
}

在这个示例中,我们创建了一个名为Person的类,这个类实现了Comparable接口,并实现了compareTo()方法。该方法比较了该对象的年龄与另一个对象的年龄,如果该对象的年龄小于另一个对象的年龄,则返回负数。如果对象的年龄等于另一个对象的年龄,则返回零。如果该对象的年龄大于另一个对象的年龄,则返回正数。

我们可以在Person类中添加其它方法,例如构造函数、获取方法等。

第二步:利用Comparable进行排序

一旦我们已经实现了Comparable接口,我们便可以使用Collections.sort()方法对我们的数组进行升序排列,例如:

ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person("Bob", 25));
persons.add(new Person("Alice", 18));
Collections.sort(persons);

我们只需调用Collections.sort()方法并将Person对象的ArrayList作为参数即可对Person对象按照年龄进行排序,利用的是compareTo()方法。

示例2

下面是另一个示例。在这个示例中,我们打算创建一个名为“Employee”的类,该类具有三个字段:姓名、年龄和薪水。我们将通过比较薪水来对Employee对象进行排序。

class Employee implements Comparable<Employee> {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }
    public double getSalary() {
        return salary;
    }
    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Employee emp) {
        return Double.compare(this.salary, emp.getSalary());
    }
}

ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee("Alice", 25, 5000));
employees.add(new Employee("Bob", 20, 3000));
Collections.sort(employees);

在这个示例中,我们创建了一个Employee类并实现了Comparable接口并实现了它的compareTo()方法。在compareTo()方法中,我们比较了该对象的salary值与另一个对象的salary值来进行比较。然后,我们创建了一个包含Employee对象的ArrayList,并使用Collections.sort()方法根据salary值进行升序排序。

所以这就是两种常见的方法,用于ArrayList自定义排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java针对ArrayList自定义排序的2种实现方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C语言实现冒泡排序算法的示例详解

    C语言实现冒泡排序算法的示例详解 冒泡排序是一种简单但效率较低的排序算法。它重复遍历要排序的数列,每次比较相邻两个元素,如果顺序不对就交换两元素顺序。该算法的时间复杂度为 O(n^2)。 以下是C语言实现冒泡排序的示例代码: #include <stdio.h> int main() { int arr[] = {5, 3, 8, 6, 4}; …

    算法与数据结构 2023年5月19日
    00
  • php实现快速排序的三种方法分享

    那么现在我将为您介绍“php实现快速排序的三种方法分享”的完整攻略。 什么是快速排序 快速排序(Quick Sort)通常被认为是对冒泡排序的一种改进。在冒泡排序中,需要进行多次的数据比较和交换操作,而快速排序与其不同之处在于它通过一个基准值将待排序的数组分成两个部分。在计算机领域,快速排序是一种常见的排序算法。 快速排序的常规实现思路 快速排序的常规实现思…

    算法与数据结构 2023年5月19日
    00
  • JS实现的冒泡排序,快速排序,插入排序算法示例

    为了给大家更好的理解,这里先介绍一下这三种排序算法的基本思想: 冒泡排序:依次比较相邻两个元素的大小,将较大的元素往后移动,每一轮比较都可以确定一个最大的元素,因此需要进行N-1轮。 快速排序:选定一个中心点,将小于这个中心点的元素排在左边,大于这个中心点的元素排在右边,然后分别对左右两边的元素重复这个操作。 插入排序:将数组按升序排列,一次将每个元素插入到…

    算法与数据结构 2023年5月19日
    00
  • C语言 扩展欧几里得算法代码

    下面我来为你详细讲解一下“C语言 扩展欧几里得算法代码”的完整攻略。 什么是扩展欧几里得算法? 扩展欧几里得算法是求解两个整数 a、b 的最大公约数(Greatest Common Divisor,简称 GCD)的一种算法。该算法可以不仅计算出最大公约数,还可以得到一组关于 a、b 的贝祖等式的整数解和一些运算过程。 算法流程 扩展欧几里得算法的流程如下: …

    算法与数据结构 2023年5月19日
    00
  • Python实现的最近最少使用算法

    Python实现最近最少使用算法 最近最少使用算法(Least Recently Used,LRU)是一种缓存淘汰策略,用于在缓存已满时选择要被淘汰的缓存块。该算法的基本思想是,当缓存已满时,淘汰最近最少使用的缓存块。 下面我们将通过python代码实现LRU算法的主要思想,并提供两个示例说明。 算法思路 LRU算法需要同时维护两个数据结构。 记录最近访问顺…

    算法与数据结构 2023年5月19日
    00
  • go实现冒泡排序算法

    下面是详细讲解Go语言实现冒泡排序算法的完整攻略: 1. 什么是冒泡排序? 冒泡排序是一种基于交换的排序算法,算法通过比较相邻的元素,将比较大的元素交换到后面,从而达到排序的目的。这个过程就像是水中不断上冒的气泡,因此称之为冒泡排序。 冒泡排序是经典的排序算法之一,它虽然时间复杂度高达 O(n^2),但其思想简单,易于理解和实现,并且在某些特殊的情况下,它的…

    算法与数据结构 2023年5月19日
    00
  • java简单选择排序实例

    Java简单选择排序是一种基于比较的排序算法,其基本思想是每次从待排序数据中选取最小(或最大)的元素,放到已排序的数据的末尾,直到所有元素都被排序完成。以下是Java简单选择排序实现的完整攻略: 算法步骤 遍历待排序的数组,每次选择最小的元素。 将已排序区间的末尾与最小元素进行交换。 扫描完整个数组,排序完成。 代码示例 下面给出了Java的简单选择排序的代…

    算法与数据结构 2023年5月19日
    00
  • Lua中写排序算法实例(选择排序算法)

    让我为您详细讲解一下Lua中写排序算法实例(选择排序算法)的完整攻略。 什么是选择排序算法 选择排序是一种简单直观的排序算法,它的工作原理如下: 在待排序的数组中找到最小元素; 将其存放到数组的起始位置; 在剩余未排序的元素中继续寻找最小值,并放到已排序序列的末尾; 重复步骤3,直到待排序序列中的所有元素均已排序完毕。 选择排序的实现思路简单,但由于每次都要…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部