Java自定义比较器实现中文排序

2025-05-29 0 18

compareTo 方法   

compareTo()是两个字符串对象比较大小,返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数。相等则返回0。compareTo()是两个字符串对象按ASCII比较大小(汉字是Unicode),返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数。相等则返回0。

Comparator 比较器   

Java 内实现自定义比较器比较简单,实现Comparator接口的compare()这个方法来制定排序规则,按照Java规范应满足以下约定,否则会抛Comparison method violates its general contract 异常。规则如下:

同时应满足以下约定:

自反性 sgn(compare(x, y)) == -sgn(compare(y, x))

传递性 compare(x, y) > 0 compare(y, z)>0) =>得出 compare(x, z)>0

一致性 (compare(x, y)==0) == (x.equals(y)),这点规范中原文是“not strictly required”,不是必须的,但是实现者应该知道不一致的后果,所以尽量实现这一要求.

?

1

2

3

4

5

6
Comparator<String> comparator = new Comparator<String>() {

@Override

public int compare(String s1, String s2) {

return s1.compareTo(s2);

}

};

以下代码示例:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
@Test

public void testCompare() {

List<String> list = new ArrayList<>();

list.add("java");

list.add("php");

list.add("c++");

System.out.println("排序前-->" + list);

Comparator<String> comparator = new Comparator<String>() {

@Override

public int compare(String s1, String s2) {

return s1.compareTo(s2);

}

};

Collections.sort(list, comparator);

System.out.println("排序后-->" + list);

Collections.reverse(list);

System.out.println("排序后逆序-->" + list);

}

Comparator中文排序

中文汉字是Unicode编码,所以排序时不是我们习惯用的拼音字母。如果还是刚才的实现,代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
@Test

public void testCompareCN() {

List<String> list = new ArrayList<>();

list.add("中国");// 中->20013 unicode编码的4E2D

list.add("英国");// 英-->33521 unicode编码的82F1

list.add("美国");// 美->32654 unicode编码的7F8E

// 汉字unicode编码表 http://www.chi2ko.com/tool/CJK.htm

System.out.println("排序前-->" + list);

Comparator<String> comparator = new Comparator<String>() {

@Override

public int compare(String s1, String s2) {

int b = s1.compareTo(s2);

return b;

}

};

Collections.sort(list, comparator);

System.out.println("排序后-->" + list);

Collections.reverse(list);

System.out.println("排序后逆序-->" + list);

// 输出字符编码对应的十进制

//char a = '美';

//System.out.println((int) a);

}

输出的这个结果不符合我们的排序习惯,因此应该用Collator指定Locale.CHINA,代码应如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28
@Test

public void testCollator() {

List<String> list = new ArrayList<>();

list.add("中国");

list.add("英国");

list.add("美国");

System.out.println("排序前-->" + list);

Collections.sort(list, new Comparator<String>() {

@Override

public int compare(String s1, String s2) {

String o1 = "";

String o2 = "";

if (s1 != null) {

o1 = s1;

}

if (s2 != null) {

o2 = s2;

}

Collator instance = Collator.getInstance(Locale.CHINA);

return instance.compare(o1, o2);

}

});

System.out.println("排序后-->" + list);

Collections.reverse(list);

System.out.println("排序后逆序-->" + list);

}

值得注意的是,compareTo不能传入null,自定义比较器时要注意。

补充知识:Java 使用比较器对TreeSet进行自定义排序

比较器是个很方便的工具

一般定义格式为

?

1

2

3

4

5

6

7

8
public static class 类名 implements Comparator{

@Override

public int compare(Object o1, Object o2) {

// TODO Auto-generated method stub

return o1 - o2;//升序

//return o2 - o1;降序

}

}

对于一个类来说,比如图书类,定义一个比较器之后,就可以对图书类的价格属性进行排序,升序降序都可以。也可以对图书类的名字进行排序

在创建集合类的时候传入一个比较器对象,系统就会识别比较器中的方法了。

例如:

TreeSet<Book> treeset = new TreeSet<Book>(new MyComparator());

下面是使用TreeSet集合+比较器对图书类价格实现的升序排序

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48
package test;

import java.util.Comparator;

import java.util.TreeSet;

public class 比较器的使用 {

public static class Book{

String name;

int price;

public Book(String name, int price) {

this.name = name;

this.price = price;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "Book:" + name + " Price:" + price;

}

}

/**

*

* @author Administrator

* 升序比较器,降序只要将b1,b2换个顺序即可

*/

public static class MyComparator implements Comparator{

@Override

public int compare(Object o1, Object o2) {

// TODO Auto-generated method stub

Book b1 = (Book) o1;

Book b2 = (Book) o2;

return b1.price - b2.price;

}

}

public static void main(String[] args) {

TreeSet<Book> treeset = new TreeSet<Book>(new MyComparator());

treeset.add(new Book("动物世界",50));

treeset.add(new Book("时间简史",25));

treeset.add(new Book("探索发现",60));

treeset.add(new Book("恐龙时代",20));

System.out.println(treeset);

}

}

以上这篇Java自定义比较器实现中文排序就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

原文链接:http://zhuhengwei.com/

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java自定义比较器实现中文排序 https://www.kuaiidc.com/118692.html

相关文章

发表评论
暂无评论