返回顶部
首页 > 资讯 > 精选 >java怎么给对象按照字符串属性进行排序
  • 491
分享到

java怎么给对象按照字符串属性进行排序

2023-07-04 15:07:34 491人浏览 薄情痞子
摘要

这篇文章主要介绍“java怎么给对象按照字符串属性进行排序”,在日常操作中,相信很多人在java怎么给对象按照字符串属性进行排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么给对象按照字符串属性进

这篇文章主要介绍“java怎么给对象按照字符串属性进行排序”,在日常操作中,相信很多人在java怎么给对象按照字符串属性进行排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么给对象按照字符串属性进行排序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

给对象按照字符串属性进行排序

在java中对象进行排序,排序的属性是string,我们只需要实现Comparator接口,然后实现比较的方式。

public class StringSort {    public static void main(String[] args) {        test1();    }    // 方式1:    public static void test1(){        JSONObject jsonObject = JSONObject.parseObject("{\"result\":[{\"id\":\"A1001\",\"text\":\"程序员\"}, {\"id\":\"G1003\",\"text\":\"建筑师\"}, {\"id\":\"D1005\",\"text\":\"设计师\"}, {\"id\":\"G1009\",\"text\":\"自由职业\"}, {\"id\":\"E2007\",\"text\":\"学生\"}, {\"id\":\"C1009\",\"text\":\"教师\"}, {\"id\":\"A1002\",\"text\":\"医生\"}, {\"id\":\"B1005\",\"text\":\"律师\"}, {\"id\":\"F2009\",\"text\":\"架构师\"}]}");        List<JSONObject> list = JSONArray.parseArray(jsonObject.getString("result"), JSONObject.class);        list.forEach(System.out::println);        Collections.sort(list, new Comparator<JSONObject>() {            @Override            public int compare(JSONObject o1, JSONObject o2) {                 return  o1.getString("id").compareTo(o2.getString("id") ); // 升序排列//                return  - o1.getString("id").compareTo(o2.getString("id") ); // 降序排列            }        });        System.out.println("--------------排序后--------------------");        list.forEach(System.out::println);    }    // 方式2:    public  static void test2(){        JSONObject jsonObject = JSONObject.parseObject("{\"result\":[{\"id\":\"A1001\",\"text\":\"程序员\"}, {\"id\":\"G1003\",\"text\":\"建筑师\"}, {\"id\":\"D1005\",\"text\":\"设计师\"}, {\"id\":\"G1009\",\"text\":\"自由职业\"}, {\"id\":\"E2007\",\"text\":\"学生\"}, {\"id\":\"C1009\",\"text\":\"教师\"}, {\"id\":\"A1002\",\"text\":\"医生\"}, {\"id\":\"B1005\",\"text\":\"律师\"}, {\"id\":\"F2009\",\"text\":\"架构师\"}]}");        List<JSONObject> list = JSONArray.parseArray(jsonObject.getString("result"), JSONObject.class);        list.forEach(System.out::println);        Collections.sort(list, (o1, o2) -> {            // return   o1.getString("id").compareTo(o2.getString("id") ); // 升序排列            return  - o1.getString("id").compareTo(o2.getString("id") ); // 降序排列        });        System.out.println("--------------排序后--------------------");        list.forEach(System.out::println);    }    // 方式3:    public  static void test3(){        JSONObject jsonObject = JSONObject.parseObject("{\"result\":[{\"id\":\"A1001\",\"text\":\"程序员\"}, {\"id\":\"G1003\",\"text\":\"建筑师\"}, {\"id\":\"D1005\",\"text\":\"设计师\"}, {\"id\":\"G1009\",\"text\":\"自由职业\"}, {\"id\":\"E2007\",\"text\":\"学生\"}, {\"id\":\"C1009\",\"text\":\"教师\"}, {\"id\":\"A1002\",\"text\":\"医生\"}, {\"id\":\"B1005\",\"text\":\"律师\"}, {\"id\":\"F2009\",\"text\":\"架构师\"}]}");        List<JSONObject> list = JSONArray.parseArray(jsonObject.getString("result"), JSONObject.class);        list.forEach(System.out::println);        Collections.sort(list, Comparator.comparing(o -> o.getString("id")));        System.out.println("--------------排序后--------------------");        list.forEach(System.out::println);    }}

三种方法实现字符串排序

排序方法概述

对于许多应用,决定顺序的键都是字符串。本篇讲述如何利用字符串的特殊性质来对其进行高效的排序。

  • 第一类方法会从右到左检查键中的字符。这种方法一般被称为低位优先(Least-Significant-DigitFirst,LSD)的字符串排序。如果将一个字符串看做一个256进制的数字,那么从右向左检查字符串就等价于先检查数字的最低位。这种方法最适合用于键的长度都相同的字符串排序应用。

  • 第二类方法会从左到右检查键中的字符,首先查看的是最高位的字符。这种方法通常称为高位优先(MSD)的字符串排序。高位优先的字符串排序和快速排序类似,因为它们都会将需要排序的数组切分为独立的部分并递归地用相同的方法处理子数组来完成排序。它们的区别之处在于高位优先的字符串排序算法在切分时仅使用键的第一个字符,而快速排序的比较则会涉及键的全部。

  • 第三种方法是高位优先的字符串排序算法的改进快速排序,根据键的首字母进行三向切分,仅在中间子数组中的下一个字符(因为键的首字母都与切分字符相等)继续递归排序。

索引计数法

作为热身,我们先学习一种适用于小整数键的简单排序方法。这种叫做键索引计数的方法本身就很实用,同时也是要学习的三种排序算法中前两种的基础。它其实就桶计数。

现在来情景引入,老师在统计学生的分数时可能会遇到以下数据处理问题。学生被分为若干组,标号为1、2、3、4等。在某些情况下,我们希望将全班同学按组分类。因为组的编号是较小的整数,使用键索引计数法来排序时很合适的。假设数组a[]中的每个元素都保存了一个名字和一个组号,其中组号在0到R-1之间,代码a[i].key()会返回指定学生的组号。四个步骤见代码

int N = a.length;int R = 256;    //R为字符基数String[] aux = new String[N];int[] count = new int[R + 1];//计算出现频率for (int i = 0; i < N; i++)     count[a[i].key() + 1]++;//将频率转换为索引for (int r = 0; r < R; r++)     count[r + 1] += count[r];//将元素分类for (int i = 0; i < N; i++)     aux[count[a[i].key()]++] = a[i];//回写for (int i = 0; i < N; i++)    a[i] = aux[i];

命题A:键索引计数法排序N个键为0到R-1之间的整数的元素需要访问数组11N+4R+1次

低位优先的字符串排序(LSD)

如果字符串的长度均为W,那就从右向左以每个位置的字符作为键,用键索引计数法将字符串排序W遍。

命题B:低位优先的字符串排序算法能够稳定地将定长字符串排序

class LSD{    // Least-Significant-Digit First    //低位优先的字符串排序(基数排序)    public static void sort(String[] a, int W) {        //通过前W个字符将a[]排序        int N = a.length;        int R = 256;    //基数        String[] aux = new String[N];  //辅助数组\        for(int d = W - 1; d >= 0; d--) {            //根据第d个字符用键索引计数法排序            int[] count = new int[R + 1];               //计算出现频率            for (int i = 0; i < N; i++)                count[a[i].charAt(d) + 1]++;            //将频率转换为索引            for (int r = 0; r < R; r++)                count[r + 1] += count[r];            //将元素分类            for (int i = 0; i < N; i++)                 aux[count[a[i].charAt(d)]++] = a[i];            //回写            for (int i = 0; i < N; i++)                 a[i] = aux[i];        }    }}

在许多字符串排序的应用中,键的长度可能互不相同。改进后的低位优先的字符串排序是可以适应这些情况的。下来讲解两种处理变长键排序的算法

高位优先的字符串排序(MSD)

首先用键索引计数法将所有字符串按照首字母排序,然后(递归地)再将每个首字母所对应的子数组排序(忽略首字母,因为每一类中的所有首字母都是相同的)。和快速排序一样,高位优先的字符串排序会将数组切分为能够独立排序的子数组来完成排序任务,但它的切分会为每个首字母得到一个子数组,而不是像快速排序中那样产生固定的两个或者三个切分。

在高位优先的字符串排序算法中,要特别注意到达字符串末尾的情况。在排序中,合理的做法是将所有字符都已被检查过的字符串所在的子数组排在所有子数组的前面,这样就不需要递归地将该子数组排序。为了简化这两步计算,我们使用了一个接受两个参数的私有方法charAt()来将字符串中字符索引转化为数组索引,当指定的位置超过了字符串末尾时该方法返回-1,。然后将所有返回值加1,得到一个非负的int值并用它作为count[]的索引。这种转换意味着字符串中的每个字符都可能产生R+1种不同的值:0表示字符串的结尾,1表示字符串的第一个字符,2表示字符串的第二个字符,等等。因为建索引计数法本来就需要一个额外的位置,所以使用代码int count[] = new int[R + 2]

class MSD{    //高位优先的字符串排序    private static int R = 256;      //基数    private static final int M = 15; //小数组的切换阈值    private static String[] aux;     //数组分类的辅助数组    private static int charAt(String s, int d) {        if(d < s.length()) {            return s.charAt(d);        }else {            return -1;        }    }    public static void sort(String[] a) {        int N = a.length;        aux = new String[N];        sort(a, 0, N - 1, 0);    }    private static void sortInsert(String[] a, int lo, int hi) {        //小型数组进行插入排序        for (int i = lo + 1; i <= hi; i++) {            for(int j = i; j > lo && a[j].compareTo(a[j - 1]) < 0; j--) {                String tmp = a[j];                a[j] = a[j - 1];                a[j - 1] = tmp;            }        }    }    private static void sort(String[] a, int lo, int hi, int d) {        //以第d个字符为键将a[lo]至a[hi]排序        if(hi <= lo + M) {            sortInsert(a, lo, hi);            return;         }        int [] count = new int[R + 2];    //计算频率        for(int i = lo; i <= hi; i++) {            count[charAt(a[i], d) + 2]++;        }        for(int r = 0; r < R + 1; r++) {  //将频率转换为索引            count[r + 1] += count[r];        }        for(int i = lo; i <= hi; i++) {   //数据分类            aux[count[charAt(a[i], d) + 1]++] = a[i];        }        for(int i = lo; i <= hi; i++) {   //回写            a[i] = aux[i - lo];         }        //递归的以每个字符为键进行排序        for(int r = 0; r <R; r++) {            sort(a, lo + count[r], lo + count[r + 1] - 1, d + 1);        }    }}

三向字符串快速排序

我们也可以根据高位优先的字符串排序算法改进快速排序,根据键的首字母进行三向切分,仅在中间子数组的下一个字符(因为键得出首字母都与切分字母相同)继续递归排序。这个算法的实现并不困难,参考往期排序算法中的三向切分快排即可。

尽管排序的方式有所不同,但三向字符串快速排序根据的仍然是键的首字母并使用递归的方法将其余部分排序。对于字符串的排序,这个方法比普通的快速排序和高位优先的字符串排序更友好。实际上,它就是两种算法的结合。

三向字符串快速排序只将数组切分为三部分,因此当相应的高位优先的字符串排序产生的非空切分较多时,它需要移动的数据量就会变大,因此它需要进行一系列的三向切分才能够取得多向切分的效果。但是,高位优先的字符串排序可能会创建大量(空)子数组,而三向字符串快速排序的切分总是只有三个。因此三向字符串快速排序能够很好地处理等值键、有较长公共前缀的键、取值范围较小的键和小数组-----所有高位优先的字符串排序算法不擅长的各种情况。

class Quick3string{    //三向字符串快速排序    private static int charAt(String s, int d) {        if(d < s.length()) {            return s.charAt(d);        }        return -1;    }        public static void sort(String[] a) {        sort(a, 0, a.length - 1, 0);    }        private static void sort(String[] a, int lo, int hi, int d) {        if(hi <= lo) {            return;        }        int lt = lo, gt = hi, i = lo + 1;        int v = charAt(a[lo], d);        while(i <= gt) {            int t = charAt(a[i], d);            if(t < v) {                exch(a, lt++, i++);            }else if(t > v) {                exch(a, i, gt--);            }else {                i++;            }        }        //a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]        sort(a, lo, lt - 1, d);        if(v >= 0) {            sort(a, lt, gt, d + 1);        }        sort(a, gt + 1, hi, d);    }        private static void exch(String[] a, int i, int j) {        String t = new String(a[i]);        a[i] = a[j];        a[j] = t;    }}

在将字符串数组a[]排序时,根据它们的首字母进行三向切分,然后(递归地)将得到的三个子数组排序:一个含有所以首字母小于切分字符的字符串子数组,一个含有所以首字母等于切分字符串的子数组(排序时忽略它们的首字母),一个含有所有首字母大于切分字符的字符串的子数组。

到此,关于“java怎么给对象按照字符串属性进行排序”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java怎么给对象按照字符串属性进行排序

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

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

猜你喜欢
  • java怎么给对象按照字符串属性进行排序
    这篇文章主要介绍“java怎么给对象按照字符串属性进行排序”,在日常操作中,相信很多人在java怎么给对象按照字符串属性进行排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么给对象按照字符串属性进...
    99+
    2023-07-04
  • 按给定切片对切片字符串进行排序/排序
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《按给定切片对切片字符串进行排序/排序》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发!...
    99+
    2024-04-04
  • 在 mYsql 中按字符长度对字符串进行排序?
    您可以借助 MySQL 的 CHAR_LENGTH() 函数按字符长度排序。该函数返回字符数,即以下字符串的 4 个 -AMIT要按字符长度对字符串进行排序,语法如下 -select *from yourTableName ord...
    99+
    2023-10-22
  • Mysql怎么对字符串进行排序
    Mysql对字符串进行排序的方法示例:利用ORDER BY关键字进行排序。语法:SELECT column_name,column_nameFROM table_nameORDER BY column_name,column_nam...
    99+
    2024-04-02
  • 怎么在Shell中对字符串进行排序
    怎么在Shell中对字符串进行排序?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。【方法一】按ASCII正向排序备注:1) tr将子字符串中的空白转换为换行符,再...
    99+
    2023-06-09
  • java怎么对string字符串排序
    在Java中,你可以使用`Arrays`类的`sort`方法对字符串进行排序。以下是一个示例:```javaimport java....
    99+
    2023-09-14
    string java
  • java如何根据List内对象的属性进行排序
    这篇文章主要介绍了java如何根据List内对象的属性进行排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一:实现Comparator接口,并重写compare方法实体...
    99+
    2023-05-30
  • java字符串怎么排序
    编写应用程序,该类中有一个方法sort()(其原型为:void sort(String str[])),从命令行传入多个字符串,调用方法sort()对该字符串数组按字典顺序从小到大排序。代码如下: (推荐学习:jav...
    99+
    2019-04-10
    java教程 java
  • oracle字符串按数字排序怎么实现
    要实现oracle字符串按数字排序,可以使用oracle的ORDER BY子句,并结合REGEXP_SUBSTR函数将字符串中的数字...
    99+
    2024-04-09
    oracle
  • python如何实现按照键或者数值对字典进行排序
    这篇文章主要介绍python如何实现按照键或者数值对字典进行排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如何实现按照键或者数值对字典进行排序# 按照键或者数值对字典进行排序dict3 =&n...
    99+
    2023-06-27
  • java的list数组按数组中对象的某个属性排序
    在 Java 中,可以使用 Collections.sort() 方法和 Comparator 接口来对 List 中的对象按照对象的某个属性进行排序。以下是一个示例代码: 假设有一个 Person 类,它包含一个 name 字符串属性和一...
    99+
    2023-08-18
    java 开发语言 jvm
  • java使用lambda表达式对List对象集合的某个属性进行排序
    这里新建一个UserInfo对象,用来测试lambda表达式排序,属性如下:public class UserInfo { private int id; private int age; private Strin...
    99+
    2021-07-02
    java lambda List 对象集合 属性 排序
  • java怎么对list进行排序
    Java中可以使用Collections.sort()方法对List进行排序。具体步骤如下:1. 导入java.util包中的Col...
    99+
    2023-09-14
    java
  • Java字符串字段升序排序怎么实现
    你可以使用Java中的`Arrays.sort()`方法来实现字符串字段的升序排序。以下是一个示例代码:```javaimport ...
    99+
    2023-09-14
    Java
  • python怎么对字典进行排序
    在Python中,可以使用`sorted()`函数对字典进行排序。字典本身是无序的,但可以将其转换为一个由键值对元组组成的列表,然后...
    99+
    2023-10-12
    python
  • php怎么实现对字符串的排序
    实现步骤:1、利用str_split()函数将字符串转为字符数组,语法“str_split(字符串)”;2、使用asort()或arsort()函数来对字符数组进行升序排序或降序排序,语法“asort(字符数组)”或“arsort(字符数组...
    99+
    2024-04-02
  • JavaScript中怎么对对象数组进行排序
    这期内容当中小编将会给大家带来有关JavaScript中怎么对对象数组进行排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基本数组排序默认情况下,Array.sort函...
    99+
    2024-04-02
  • java json字符串怎么转json对象
    可以使用Java的JSON库来将JSON字符串转换为JSON对象。常用的JSON库有GSON、Jackson、Fastjson等。以...
    99+
    2023-09-27
    java json
  • Java中怎么对字符串进行utf-8编码
    本篇内容介绍了“Java中怎么对字符串进行utf-8编码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!java对字符串进行utf-8编码我们...
    99+
    2023-07-06
  • 利用java怎么对两个对象的属性进行比较
    利用java怎么对两个对象的属性进行比较?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。两个对象进行比较相等,有两种做法:1、情况一:当仅仅只是判断两个对象是否相...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作