广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Arrays.sort()和lambda表达式
  • 247
分享到

基于Arrays.sort()和lambda表达式

2024-04-02 19:04:59 247人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Arrays.sort()和lambda表达式1、对基本数据类型数组的排序2、给对象数组排序再谈Comparator-使用lambda表达式以前现在Arrays.sort()和l

Arrays.sort()和lambda表达式

1、对基本数据类型数组的排序

数字排序:


int[] intArray = new int[]{1,34,5,-9};
Arrays.sort(intArray);
System.out.println(Arrays.toString(intArray));

字符串排序(先大写后小写):


String[] strArray = new String[]{"Z", "a", "D"}; 
Arrays.sort(strArray); 
System.out.println(Arrays.toString(strArray));

字符串排序(忽略大小写):


Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

反向排序:


Arrays.sort(strArray, Collections.reverseOrder());

注意:Arrays.sort()使用的是双轴快排:

1.对于很小的数组(长度小于27),会使用插入排序。

2.选择两个点P1,P2作为轴心,比如我们可以使用第一个元素和最后一个元素。

3.P1必须比P2要小,否则将这两个元素交换,现在将整个数组分为四部分:

(1)第一部分:比P1小的元素。

(2)第二部分:比P1大但是比P2小的元素。

(3)第三部分:比P2大的元素。

(4)第四部分:尚未比较的部分。

在开始比较前,除了轴点,其余元素几乎都在第四部分,直到比较完之后第四部分没有元素。

4.从第四部分选出一个元素a[K],与两个轴心比较,然后放到第一二三部分中的一个。

5.移动L,K,G指向。

6.重复 4 5 步,直到第四部分没有元素。

7.将P1与第一部分的最后一个元素交换。将P2与第三部分的第一个元素交换。

8.递归的将第一二三部分排序。

对于基本类型的数组如int[], double[], char[] ,Arrays类只提供了默认的升序排列,没有降序,需要传入自定义比较器,使用Arrays.sort(num,c),传入一个实现了Comparator接口的类的对象c。逆序排列:


Arrays.sort(num,new Comparator<Integer>(){
  public int compare(Integer a, Integer b){
    return b-a;
  }
});

Arrays的其他方法:

  • Arrays.sort(num, fromIndex, toIndex);给某区间排序。
  • Arrays.sort(num, fromIndex, toIndex,c);给某区间按c比较器排序。

2、给对象数组排序

要先Comparable接口或Comparator接口。

两种比较器的对比:

内部比较器: 需要比较的对象必须实现Comparable接口,并重写compareTo(T o)方法,表明该对象可以用来排序,否则不能直接使用Arrays.sort()方法。


public class Employee implements Comparable<Employee> {  
      
    private int id;// 员工编号  
    private double salary;// 员工薪资  
      
    public int getId() {  
        return id;  
    }  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public double getSalary() {  
        return salary;  
    }  
  
    public void setSalary(double salary) {  
        this.salary = salary;  
    }  
      
    public Employee(int id, double salary) {  
        super();  
        this.id = id;  
        this.salary = salary;  
    }  
      
    // 为了输出方便,重写toString方法  
    @Override  
    public String toString() {  
        // 简单输出信息  
        return "id:"+ id + ",salary=" + salary;  
    }  
  
    // 比较此对象与指定对象的顺序  
    @Override  
    public int compareTo(Employee o) {  
        // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1  
        int result = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1);  
        // 如果编号相等,则比较薪资  
        if (result == 0) {  
            // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1  
            result = this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1);  
        }  
        return result;  
    }    
}  

外部比较器: 需要自己写一个比较器实现Comparator接口,并实现compare(T o1, T o2)方法,根据自己的需求定义比较规则。使用外部比较器这种方式比较灵活,例如现在需求是按照员工编号和薪资进行排序,以后可能按照姓名进行排序,这时只要再写一个按照姓名规则比较的比较器就可以了。


  
public class TestEmployeeCompare {  
  
      
    public static void main(String[] args) {  
          
        List<Employee> employees = new ArrayList<Employee>();  
        employees.add(new Employee(2, 5000));  
        employees.add(new Employee(1, 4500));  
        employees.add(new Employee(4, 3500));  
        employees.add(new Employee(5, 3000));  
        employees.add(new Employee(4, 4000));  
        // 内部比较器:要排序的对象要求实现了Comparable接口 ,直接传入该对象即可
        Arrays.sort(employees);  
        System.out.println("通过内部比较器实现:");  
        System.out.println(employees);  
          
        List<Employee> employees2 = new ArrayList<Employee>();  
        employees2.add(new Employee(2, 5000));  
        employees2.add(new Employee(1, 4500));  
        employees2.add(new Employee(4, 3500));  
        employees2.add(new Employee(5, 3000));  
        employees2.add(new Employee(4, 4000));  
        // 外部比较器:自定义类实现Comparator接口  ,需要传入自定义比较器类
        Arrays.sort(employees2, new EmployeeComparable());  
        System.out.println("通过外部比较器实现:");  
        System.out.println(employees2);  
    }  
  
}  
  
  
class EmployeeComparable implements Comparator<Employee> {  
  
    @Override  
    public int compare(Employee o1, Employee o2) {  
        // 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1  
        int result = o1.getId() > o2.getId() ? 1 : (o1.getId() == o2.getId() ? 0 : -1);  
        // 如果编号相等,则比较薪资  
        if (result == 0) {  
            // 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1  
            result = o1.getSalary() > o2.getSalary() ? 1 : (o1.getSalary() == o2.getSalary() ? 0 : -1);  
        }  
        return result;  
    }        
} 

最后巧用lambda表达式:(参数) -> 一个表达式或一段代码

如:

实现逆序:


Arrays.sort(nums, ( Integer a, Integer b) -> { return b-a;});

字符串数组,按长度排序:


Arrays.sort(strs, (String first, String second) ->
{
    if(first.length() < second.length()) return -1;
    else if(first.length() > second.length()) return 1;
    else return 0;
});

再谈Comparator-使用lambda表达式

先写一个Person类,主要有address跟name两个成员属性以及他们的getter()方法,最后补刀重写toString()方法


public class Person {
    private String address;
    private String name;
    public Person(String firstName, String lastName) {
        this.address = firstName;
        this.name = lastName;
    }
    public String getAddress() {
        return address;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return getClass().getSimpleName()+"{" +
                "address='" + address + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

以前

以前写比较排序的时候,总需要写一大堆代码,比如下面:


public class TestCh06 {
    public static void main(String... args) throws CloneNotSupportedException {
        //定义一个Person类数组
        Person[] arr = {new Person("wo", "2722"), new Person("uj", "2829"), new Person("dh", "272"),
                new Person("us", "1"), new Person("jaka", "881711")};
        LenComparator lc = new LenComparator();
        //排序
        Arrays.sort(arr, lc);
        System.out.println(Arrays.toString(arr));
    }
}

class LenComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return Integer.compare(o1.getName().length(), o2.getName().length());
    }
}

现在

如今Java8SE出来了很久了,如果还使用上面的代码写作确实有点缺优雅,因为Comparator接口包含了很多方便的静态方法类创建比较器(这些方法可以用于lambda表达式或者方法引用)


        //按照名字进行排序
        Arrays.sort(arr, Comparator.comparing(Person::getName));
        //按照名字长度进行排序
        Arrays.sort(arr,Comparator.comparing(Person::getName,(s,t)->Integer.compare(s.length(),t.length())));
        Arrays.sort(arr,Comparator.comparingInt(p->p.getName().length()));
        //先按照名字进行排序,如果名字相同,再按照地址比较
        Arrays.sort(arr,Comparator.comparing(Person::getName).thenComparing(Person::getAddress));

温馨提示:其实在平常用的比较也不多,只是在需要的时候才用到,更希望大家可以掌握一些lambda表达式更好

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 基于Arrays.sort()和lambda表达式

本文链接: https://www.lsjlt.com/news/160430.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Arrays.sort()和lambda表达式
    目录Arrays.sort()和lambda表达式1、对基本数据类型数组的排序2、给对象数组排序再谈Comparator-使用lambda表达式以前现在Arrays.sort()和l...
    99+
    2022-11-12
  • 基于Arrays.sort()和lambda表达式如何实现
    小编给大家分享一下基于Arrays.sort()和lambda表达式如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Arrays.sort()和lambda...
    99+
    2023-06-22
  • 基于JDK8-lambda表达式四种forEach性能对比
    jdk8新特性流Stream编程 看了网上一些性能的比较,这里自己写一个进行测试 对比以下四种 普通forEach、 java8中新的forEach、 st...
    99+
    2022-11-12
  • 关于Java 中的 Lambda 表达式
    这篇文章我们将讨论关于Java 中的 Lambda 表达式,Lambda 表达式是 Java 涉足函数式编程的过程。它接受参数并将其应用于表达式或代码块。以下是语法的基本示例: ...
    99+
    2022-11-12
  • 【javaSE】 Lambda表达式与Lambda表达式的使用
    文章目录 🌳Lambda表达式的背景🚩Lambda表达式的语法🚩函数式接口 🎋Lambda表达式的基本使用🎄...
    99+
    2023-09-15
    开发语言 java Lambda表达式 源码
  • Java8之lambda表达式基本语法
    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子:(1)class Student{ private String name; private Double score; public Stude...
    99+
    2023-05-31
    java8 lambda 表达式
  • Java Lambda 表达式
    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Java Lambda 表达式 Java L...
    99+
    2023-09-27
    java python 开发语言
  • Lambda表达式(JAVA)
    注:如果没有学过匿名内部类和接口不推荐往下看。 Lambda表达式的语法: (parameters) -> expression 或 (parameters) ->{ statements; } parameters:表示参数列表;->:可...
    99+
    2023-10-27
    java 开发语言 数据结构 lambda
  • Java中Lambda表达式基础及使用
    目录一、举例说明1、无参无返回1.1 定义一个接口1.2接口实现类1.3 测试类2、有参无返回代码示例3、有参有返回二、简单事项1、省略模式2、注意事项三、Lambda表达式和匿名内部类的区别1、所需类型不同:2、使用限制不同:3、实现原理...
    99+
    2019-12-07
    Java Lambda表达式 Java Lambda
  • Java中lambda表达式的基本运用
    目录一、实现接口二、数字排序三、字符串排序方法四、对象排序总结一、实现接口 调用一个接口中的方法,传统方法:接口类A: package lombda; public interf...
    99+
    2022-11-13
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • Python的lambda表达式
    匿名表达式---lambda介绍匿名函数- 也是就lambda表达式。介绍几个 序列处理的函数,比如序列过滤、把所有元素都拿过来做某些操作,这种的序列处理函数。这样的函数都有一些特点,会借用别函数来进行操作。这里就会用到lambda ▷匿名...
    99+
    2023-01-31
    表达式 Python lambda
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • 基于Java的正则表达式
    正则表达式概念 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则...
    99+
    2023-05-31
    java 正则表达式 ava
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则
    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口  ...
    99+
    2023-10-20
    java python 开发语言
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2022-11-12
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2022-11-12
  • python3 lambda表达式详解
    技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。这里我们简单展示一些...
    99+
    2022-06-02
    python的lambda函数 python中lambda的用法 python lambda函数怎么用
  • java lambda表达式详解
    一、Lambda初识 我们知道,在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢?那还可以使用匿名类的方式,如下: public class JavaTest { public ...
    99+
    2023-09-15
    java servlet jvm
  • 【Python】python map()函数和lambda表达式
    python map(fun,[arg]+)函数最少有两个参数,第一参数为一个函数名,第二个参数是对应的这个函数的参数(一般为一个或多个list)>>>def fun(x):...  &nbs...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作