java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值。
但是很多情况下,我们开发一款app需要结合“国情”,比如在电话本中,我们希望“李四”排在“zhangsan”的前面,但是如果采用普通的compareTo函数的字符串比较的方式,那么“zhangsan”小于“李四”,由此造成了“zhangsan”的排序先于“李四”。
 
解决方式是采用java提供的 Collator类。
 
一、原理分析:
 public abstract class Collator implements Comparator<Object>, Cloneable{}
Collator是一个抽象类,实现了Comparator和Clonable接口,Collator的构造方式有以下几种:
 
1.
 /**
* Returns a {@code Collator} instance which is appropriate for the user's default
* {@code Locale}.
* See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
*/
public static Collator getInstance() {
return getInstance(Locale.getDefault());
}
注释中已经注明:返回一个按照用户当地排序规则的Locale作为参数,一般来说getDefault()获取的Locale就会根据中国人的使用习惯进行比较。传入getInstance(Locale)函数中,接着看此函数的实现:
 
2.
 /**
* Returns a {@code Collator} instance which is appropriate for {@code locale}.
*/
public static Collator getInstance(Locale locale) {
if (locale == null) {
throw new NullPointerException("locale == null");
}
return new RuleBasedCollator(new RuleBasedCollatorICU(locale));
}
函数生成一个RuleBasedCollator对象,此对象继承了Collator抽象类
 
二、使用方法
1.工具类实现。
使用方法见下面我写的工具类:
 
 public class CompareHelper {

    public static final Collator COLLATOR = Collator.getInstance();

    public static final Comparator<Contact> COMPARATOR_CONTACT;

    static
{
COMPARATOR_CONTACT = new Comparator<Contact>(){
public final int compare(Contact a, Contact b){
return COLLATOR.compare(a.sortKeyString, b.sortKeyString);
}
};
}
private CompareHelper(){}
}

2.对List元素进行重新排序:

 Collections.sort(contacts, CompareHelper.COMPARATOR_CONTACT);

3.针对两个字符串进行“本地化”比较,使用的方法是:

                int compareRet = CompareHelper.COLLATOR.compare(stringA, stringB);

不要使用String自带的方法stringA.compareTo("stringB")。反之,当需要使用非“本地化”的比较方法时,需要使用的是stringA.compareTo("stringB")

[原创]Java中的字符串比较,按照使用习惯进行比较的更多相关文章

  1. Java中的字符串常量池,栈和堆的概念

    问题:String str = new String(“abc”),“abc”在内存中是怎么分配的?    答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...

  2. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  3. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...

  4. Java中的字符串拼接

    Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...

  5. java中,字符串类型的时间数据怎样转换成date类型。

    将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...

  6. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

  7. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  8. 《Java入门第三季》第二章 认识 Java 中的字符串

    什么是 Java 中的字符串.1.在Java的世界里,字符串被作为String类型的对象处理. 2.通用的初始化的方式:String s = new String("i love you & ...

  9. 为什么Java中的字符串是不可变的?

    原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改 ...

随机推荐

  1. 【转】linux sort 命令详解

    sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...

  2. 用js创建XMLHttpRequest对象池[转]

    //使用literal语法定义一个对象:XMLHttp var XMLHttp = { //定义第一个属性,该属性用于缓存XMLHttpRequest对象的数组 XMLHttpRequestPool: ...

  3. HDOJ ——统计难题

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  4. SQL*Net message to client

    SQL*Net message to client The server (foreground process) is sending a message to the client. 这个wait ...

  5. Eddy&#39;s picture(最小生成树)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. JAVA_SE基础——编码规范&代码编写规则

    这次我来给大家说明下编码规范&代码编写规则  ↓ 编码规范可以帮助程序员在编程时注意一些细节问题,提高程序的可读性,让程序员能够尽快地理解新的代码,并帮助大家编写出规范的利于维护的Java代码 ...

  7. 010-docker-安装-elasticsearch:5.4.3

    1.搜索镜像 docker search elasticsearch 2.拉取合适镜像 选择合适tag:https://hub.docker.com/ docker pull elasticsearc ...

  8. 类与接口(三)java中的接口与嵌套接口

    一.接口 1. 接口简介 接口: 是java的一种抽象类型,是抽象方法的集合.接口比抽象类更加抽象的抽象类型. 接口语法: [修饰符] [abstract] interface 接口名 [extend ...

  9. Robots.txt 编写

    搜索引擎Robots协议,是放置在网站根目录下robots.txt文本文件,在文件中可以设定搜索引擎蜘蛛爬行规则.设置搜索引擎蜘蛛Spider抓取内容规则.下面Seoer惜缘举例robots写法规则与 ...

  10. 2018.08.06bzoj1251: 序列终结者(非旋treap)

    传送门 平衡树板子题. 直接fhqtreap打区间标记就行了. 代码: #include<bits/stdc++.h> #define N 50005 using namespace st ...