我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Arrays.sort()和lambda表达式如何实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于Arrays.sort()和lambda表达式如何实现

小编给大家分享一下基于Arrays.sort()和lambda表达式如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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()使用的是双轴快排:

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

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

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

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

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

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

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

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

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

移动L,K,G指向。

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

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

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

对于基本类型的数组如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));

以上是“基于Arrays.sort()和lambda表达式如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Arrays.sort()和lambda表达式如何实现

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

下载Word文档

猜你喜欢

基于Arrays.sort()和lambda表达式如何实现

小编给大家分享一下基于Arrays.sort()和lambda表达式如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Arrays.sort()和lambda
2023-06-22

如何在C#项目中创建一个Lambda表达式和Lambda表达式树

如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、表达式Lambda  表达式位于 => 运算符右侧的 la
2023-06-06

如何使用.NET Lambda表达式实现委托

本篇内容介绍了“如何使用.NET Lambda表达式实现委托”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.NET Lambda表达式的写法
2023-06-18

C#如何实现递归调用的Lambda表达式

这篇文章主要讲解了“C#如何实现递归调用的Lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现递归调用的Lambda表达式”吧!首先给一个简单的示例: int
2023-07-02

C++ lambda 表达式如何定义和使用?

c++++ lambda 表达式是匿名函数,用于内联定义函数,使用语法:[capture list](parameters) -> return_type {函数体}。它们可以捕获外部范围内的变量,传递参数,并指定返回类型。lambda 表
C++ lambda 表达式如何定义和使用?
2024-04-17

lambda表达式与传统接口函数如何实现

这篇文章主要讲解了“lambda表达式与传统接口函数如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“lambda表达式与传统接口函数如何实现”吧!一、接口定义首先,我们要明白lambd
2023-06-29

用 C++ lambda 表达式自定义排序规则如何实现?

使用 c++++ lambda 表达式自定义排序规则,可灵活定义排序逻辑。语法为:[capture list](parameters) -> return type { body }。实战案例中,lambda 表达式 sortlambda
用 C++ lambda 表达式自定义排序规则如何实现?
2024-04-17

如何理解.NET 3.5扩展方法和Lambda表达式

如何理解.NET 3.5扩展方法和Lambda表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对于上文的简化需求,使用Lambda表达式和内置的.NET 3.5扩展方法便可
2023-06-18

Java如何使用 Lambda 表达式实现超强的排序功能

这篇文章主要介绍Java如何使用 Lambda 表达式实现超强的排序功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先,我们定义一个基础类,后面我们将根据这个基础类演示如何在内存中排序。@Data@NoArgsC
2023-06-25

python如何实现三元表达式

这篇文章主要介绍了python如何实现三元表达式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。三元表达在许多用例中,我们需要根据条件定义具有特定值的变量,并且我们可以简单地使
2023-06-27

LINQ如何实现查询表达式

这篇文章主要介绍了LINQ如何实现查询表达式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新建一个叫Step1.aspx的新页面。添加一个GridView控件到页面中,如下所
2023-06-17

python如何实现列表推导表达式

这篇文章主要为大家展示了“python如何实现列表推导表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现列表推导表达式”这篇文章吧。列表推导表达式列表推导表达式是创建列表的
2023-06-27

C++如何实现中缀表达式转化为后缀表达式

这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象
2023-06-29

lambda 表达式如何改善代码的可读性和简洁性?

是的,lambda 表达式通过消除匿名内部类、减少冗余并增强可读性,提升了 java 代码的可读性、简洁性和可维护性。这些好处包括:消除匿名内部类,避免创建临时类。减少冗余,移除不必要的代码块和方法名。增强可读性,使代码更流畅且易于理解。提
lambda 表达式如何改善代码的可读性和简洁性?
2024-04-25

后缀表达式的java如何实现

这篇“后缀表达式的java如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“后缀表达式的java如何实现”文章吧。中缀表
2023-07-02

python如何实现生成器表达式

小编给大家分享一下python如何实现生成器表达式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!生成器表达式Python中的生成器是创建迭代器的一种简便方法。因为
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录