java集合中中文排序_【Java】【集合&数组】【排序】【Java中对汉字进行简单的排序】2016.02.28...

一、对数组的包含中文元素来进行排序

在Java中一般的String数组排序可以调用Arrays类的sort(Object[] a)方法进行排序,代码类似:

String[] strs = {"张三(Z)","李四(L)","王五(W)"};

// 排序,默认是升序

Arrays.sort(strs);

但是当我们将以上结果打印出来,你会发现结果很混乱,并不是和我们预想的那样按照汉语拼音进行排序的。为何呢?我们知道该方法是通过数组元素的compareTo方法来进行比较的,那我们看看String类的compareTo的主要实现:

while(k 

// 原字符串的字符数组

charc1 = v1[k];

// 比较字符串的字符数组

charc2 = v2[k];

if(c1 != c2) {

// 比较两者的char值大小

returnc1 - c2;

}

k++;

}

上面的代码先取得字符串的字符数组,然后一个一个地比较大小,这里是对字符进行比较(使用减号),也就是UNICODE码值进行比较,而并不是通过汉字的拼音进行排序的,这一点在JDK的说明文档中也有说明:对于非英文的String排序可能会出现不准确的情况。那该如何解决该问题呢?Java推荐使用Collator类进行排序,代码如下:

String[] strs = {"张三(Z)","李四(L)","王五(W)"};

// 定义一个中文排序器

Comparator c = Collator.getInstance(Locale.CHINA);

// 升序排序

Arrays.sort(strs, c);

但是Java并不能精确的对所有的汉字进行排序,比如对“犇”和“鑫”进行排序,你就会发现结果又乱了!只是因为我们的汉字文化太博大精深了,要做好这个排序确实有点难为Java了。更深层次的原因是Java使用的是 UNICODE 编码,而中文 UNICODE 字符集是来源于 GB18030 的,GB18030 又是从GB2312 发展起来的, GB2312 是一个包含  7000 多个字符的字符集,它是按照拼音排序,并且是连续的,之后的 GBK、GB2312 都是在起基础上扩充而来的,所以要让它们完整排序也就难上加难了。但如果排序对象是经常使用的汉字,使用Collator类排序完全可以满足我们的要求。

如果需要严格排序,可以使用一些开源项目来自己实现,比如 pinyin4j 可以把汉字转换为拼音,然后我们自己来实现排序算法,不过此时你也会发现要考虑诸如算法、同音字、多音字等众多问题。

二、以上是对数组中的中文元素进行排序,下面是对集合中的中文元素来进行排序

(注:对于集合中的排序,List集合自身并不带有排序的功能,所以我们需要自定义比较器,然后在主函数当中去调用Collections这个类中的sort静态方法来实现集合中的比较,这样集合在输出的时候就是已经排序好的汉字了;其中,集合中的比较器有两个,一个是Comparable,另一个则是Comparator,两个接口的用法也是大同小异)

下面是针对ArrayList集合中的中文来进行比较输出的代码

package com.geminno.he0228;

import java.text.CollationKey;

import java.text.Collator;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.Iterator;

import java.util.List;

import java.util.Locale;

public class SortStringDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

List list=new ArrayList<>();

list.add(new Student("张三 4zhang", 23));//zhang  4

list.add(new Student("李四 1li", 20));//li  1

list.add(new Student("王五 3wang", 30));//wang  3

list.add(new Student("赵六 5zhao", 52));//zhao  5

list.add(new Student("刘七 2liu", 16));//liu  2

Collections.sort(list,new Student());

Iteratoriterator=list.iterator();

while (iterator.hasNext()) {

Student student = (Student) iterator.next();

System.out.println(student.getName()+" "+student.getAge());

}

}

}

class Student implements Comparator{

private String name;

private int age;

private Collator collator=Collator.getInstance(Locale.CHINA);

public Student() {

// TODO Auto-generated constructor stub

}

public Student(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int compare(Student o1, Student o2) {

// TODO Auto-generated method stub

//使用默认语言环境的规则将此 String 中的所有字符都转换为小写

//把字符串转换为一系列比特,它们可以以比特形式与 CollationKeys 相比较

CollationKey key1=collator.getCollationKey(o1.name);// toLowerCase()方法 返回的是String类型,

CollationKey key2=collator.getCollationKey(o2.name);

return key1.compareTo(key2);//返回的分别为1,0,-1 分别代表大于,等于,小于。要想按照字母降序排序的话 加个“-”号

}

}

其中我们需要用到Collator这个类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值