Java 中文排序方式的尝试

14 篇文章 0 订阅


一、通过实现Comparable接口,这种方式表明,类自身是可比较的,有了比较才能进行排序。最好提供一种标志,如一个整形的属性,或者字符串类型。

代码说明

package sort;

public class User implements Comparable<User> {

	private String name;
	private Integer order;
	
	@Override
	public int compareTo(User o) {
		return this.getOrder().compareTo(o.getOrder());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getOrder() {
		return order;
	}

	public void setOrder(Integer order) {
		this.order = order;
	}


	
}

整形的自身比较标识符,通过Collections.sort方法排序即可。

测试方法

public static void test0() {
		User user1 = new User();
		user1.setName("汉文");
		user1.setOrder(1);
		User user2 = new User();
		user2.setName("彝文");
		user2.setOrder(2);
		User user3 = new User();
		user3.setName("藏文");
		user3.setOrder(3);
		List<User> list = new ArrayList<User>();
		list.add(user3);
		list.add(user1);
		list.add(user2);
		Collections.sort(list);
		foreach(list);
	}

字符串类型的比较器和测试代码

package sort;

import java.text.Collator;
import java.util.Locale;

public class Employee implements Comparable<Employee> {

	private String name;

	public static Collator collator = Collator.getInstance(Locale.CHINESE);
	
	public Employee(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(Employee o) {
		return collator.compare(this.getName(), o.getName());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


测试代码

public static void test3() {
		
		Employee e = new Employee("谢谢");
		Employee e2 = new Employee("不客气");
		
		List<Employee> list = Arrays.asList(e,e2);
		
		Collections.sort(list);
		 
		for (Employee o : list) {
			
			System.out.println(o.getName());
		}
	}

通过实现Comparable接口可实现简单的比较排序

二、通过实现Comparator接口,实现更多的排序规则。Comparator接口是一个工具类接口,它的名字含义是比较器的意思,即表示,用作比较,它与原有类的逻辑没有关系,只是实现两个类的比较逻辑,从这方面来说,一个类有多个比较器,只要有业务需求就可以产生比较器,就可以产生多种排序算法。

代码实现

package sort;

import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class ChineseStringComparator implements Comparator<User> {

	public static Collator collator = Collator.getInstance(Locale.CHINESE);

	@Override
	public int compare(User o1, User o2) {
		int i = collator.compare(o1.getName(), o2.getName());
		System.out.println("Compare To: " + i);
		return i;
	}

}

测试代码

public static void test2() {
		User user1 = new User();
		user1.setName("你");
		User user2 = new User();
		user2.setName("爱");
		User user3 = new User();
		user3.setName("他");
		List<User> list = new ArrayList<User>();
		list.add(user1);
		list.add(user2);
		list.add(user3);

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

		foreach(list);

	}
实例化一个Locale环境里中的Collator 对象,产生比较。这种方式大部分的中文能比较出结果,有点Bug的地方就是多音字会出现问题,如藏文,汉文,彝文,这三个词组会有问题(可自行测试)

三、总结

Comparable接口是实现类的默认排序算法,一个类稳定成熟后其compareto方法几乎不会变,而Comparator接口则是一个类的扩展排序工具。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值