将List<Object>集合(汉字、字母、数字)按照拼音来排序

4 篇文章 0 订阅
2 篇文章 0 订阅

目录

 

将List<Object>集合按照拼音来排序

1.需求

2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子

2.1.数组排序:

2.2集合对象:

3.实现混合排序


将List<Object>集合按照拼音来排序

 

 

1.需求

混合排列 汉字、字母、数字,数字排在最前,字母跟汉字统一按照升序(a-z)来排列

2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子

2.1.数组排序:

String[] li = new String[]{
                "啊", "好", "bbb"
        };
 Arrays.sort(li);
        for (String s : li) {
            System.out.println(s);
        }

 会输出:

        bbb
		啊
		好

从打印结果看,bbb在 啊 之前,明显不符合我们的需求

2.2集合对象:

List<User> list = Arrays.asList(
                new User("就", 25),
                new User("bbbbbb", 25),
                new User("啊dd", 25),
                new User("aaaa", 25),
                new User("a试试", 25),
                new User("a试试", 24),
                new User("啊aaz", 25)
        );
         Collections.sort(list, (l1, l2) -> {
            Collator instance = Collator.getInstance(Locale.CHINA);
            return instance.compare(l1.name, l2.name);
        });
         for (User user : list) {
            System.out.println(user);
        }

输出:

    user{name=aaaa, age=25}
	user{name=a试试, age=25}
	user{name=a试试, age=24}
	user{name=bbbbbb, age=25}
	user{name=啊aaz, age=25}
	user{name=啊dd, age=25}
	user{name=就, age=25}

在输出的结果中可以看到 bbbbbb 排到了啊aaz前面,这个明显不符合我们的预期

3.实现混合排序

具体代码

public class Test {
 		@RequiresApi(api = Build.VERSION_CODES.N)
    	public static void main(String[] args)  {

		 class User {
            String name;
            int age;
            public User (String name, int age) {
                this.name = name;
                this.age = age;
            }
            @Override
            public String toString() {
                return "User {" +
                        "name='" + name +
                        ", age=" + age +
                        '}';
            }
			List<User > list = Arrays.asList(
                new User ("就", 25),
                new User ("bbbbbb", 25),
                new User ("啊dd", 25),
                new User ("aaaa", 25),
                new User("1", 25),
                new User("2", 25),
                new User ("a试试", 25),
                new User ("a试试", 24),
                new User ("啊aaz", 25)
        );
		 Collections.sort(list, (u1, u2) -> {
        
            int result = ToPinyin(u1.name).compareTo(ToPinyin(u2.name));
            if (result==0)
            {
                return u1.age-u2.age;
            }
            return result;
        });
         for (User user : list) {
            System.out.println(user);
        }
        }

    }
      /**
     * 汉字转为拼音
     * @param chinese
     * @return
     */
     public static String ToPinyin(String chinese) {
       return ToPinyin(chinese,"");
    }
    /**
     * 汉字转为拼音
     * @param chinese
     * @param separator 分隔符
     * @return
     */
    public static String ToPinyin(String chinese,String separator) {
        String pinyinStr = "";
        char[] newChar = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i],defaultFormat)[0]+separator;

                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();

                }

            } else {
               pinyinStr += newChar[i] +separator;

            }

        }
         return pinyinStr.substring(0,pinyinStr.length()-1);

    }

}

输出:

        user{name=1, age=25}
		user{name=2, age=25}
		user{name='aaaa, age=25}
		user{name='啊aaz, age=25}
		user{name='啊dd, age=25}
		user{name='a试试, age=24}
		user{name='a试试, age=25}
		user{name='bbbbbb, age=25}
		user{name='就, age=25}

 

看到输出的结果按照我们预期想需求排列了

代码使用到了pinyin.jar,有需要的小伙伴可以点击下方链接去下载

pinyin.jar下载地址为:https://download.csdn.net/download/next_D/15839883

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值