java 字符和汉字比较_Java比较汉字字符串排序与C++比较汉字排序

一、Java比较汉字

// Collator 类是用来执行区分语言环境的 String 比较的,这里选择使用CHINA

Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);

TreeMap tree=new TreeMap(cmp);

String[] arr = {"张三", "李四", "王五"};

// 使根据指定比较器产生的顺序对指定对象数组进行排序。

Arrays.sort(arr, cmp);

for (int i = 0; i < arr.length; i++)

System.out.println(arr[i]);

names = ["张三", "李四", "王五", "刘六"];

names.sort(function(a,b){return a.localeCompare(b)});//a,b 为数组a的某两个值,自动传入

alert(names);

另:

示例文本:

String [] test = new String[] {

"作业",

"测试",

"test",

"我们",

"。空",

"镂空",

"[",

"浏",

"皙"

};

jdk 版本:

1.5.6

开发平台:

Eclipse 3.1

关键字: 中文排序

概述

我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。

我们可能会经常使用

java.util.

接口,

java.util.Comparator super T> c))

等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用

方法,这个方法是比较2个字符的 codepoint value,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。

java.text.

接口及其实现类

其实 java 中提供了和语言相关的类,即 Collator 接口及其实现类。

是一个具体类,它实现了 Comparator 接口中的 compare(Object, Object) 方法。 RuleBasedCollator 根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅 java API 获取此类的详细信 息。

如果我们需要对一个有中文的数组进行排序,则可以使用这个类。请看如下示例代码:

import java.util.*;

import java.text.*;

public class Test

{

"作业",

"测试",

"test",

"我们",

"。空",

"镂空",

"[",

"浏",

"皙"

};

java.util.

"============");

for(

}

以上代码的输出结果为:

============

[

test

。空

测试

我们

作业

镂空

大家可能会发现只有一部分汉字是按照汉语拼音排序了,还有几个没有。

问题分析:

GB2312:

在简体中文中我们使用比较多的字符集是 GB2312-80,简称为 GB2312,这个字符集包含了目前最常用的汉字共计 6736 个。其中的汉字分为两大类:

常用汉字

次常用汉字

常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。

简体汉字在 Unicode 中一般是按照 gb2312 的码点值的顺序来放置的,所以如果是常用汉字 java 就能够很准确的进行排序,但如果是次常用汉字,则就会出现问题。在以上示例中,"镂","皙" 属于次常用字。

解决方案:

RuleBasedCollator 类 getRules() 方法可以返回对应语言的规则设置。简体中文对应的规则是 gb2312 所对应的字符。

我们可以把其中的全部汉字提取出来

对这些汉字重新排序

利用RuleBasedCollator(String rules) 构造器新建一个定制的 RuleBasedCollator

参考代码

在以下的代码中,我把排过序的汉字直接作为 String 对象放在类里面了,如果要让代码变得简洁一些,则可以把完整的规则(特殊字符+排序汉字)存为文件。

package sorting;

import java.util.*;

import java.text.*;

/**

* @author GaoJianMin

*

*/

public class ChineseGB2312Collator

{

/**

* @return a customized RuleBasedCollator with Chinese characters (GB2312) sorted correctly

*

*/

public static final RuleBasedCollator getFixedGB2312Collator()

{

null;

try

{

fixedGB2312Collator = new java.text.

ChineseGB2312Collator.getGB2312SpecialChars() +

GB2312Chars

);

{

e.printStackTrace();

}

return fixedGB2312Collator;

}

/**

* @return the special characters in GB2312 charset.

*

*/

public static final String getGB2312SpecialChars()

{

//index 2125 is the last symbol "╋"

return zh_CNCollator.getRules().substring(0,2125);

}

/**

* 6763 Chinese characters in GB2312 charset

*/

public static final String GB2312Chars =

"

"

}

package sorting;

import java.util.*;

import java.text.*;

/**

* @author GaoJianMin

*

*/

public class ChineseGB2312Comparator implements Comparator<

ChineseGB2312Collator.getFixedGB2312Collator();

private String str1;

/**

* @param str1

*/

public ChineseGB2312Comparator(

this.str1 = str1;

}

/**

*

*/

public ChineseGB2312Comparator() {

this.str1="";

}

/**

* @param str1

* @param str2

* @return an integer indicatint the comparison result

* @see java.util.Comparator#compare(Object, Object)

*/

public int compare(

return GB2312Collator.compare(str1, str2);

}

/**

* @param str2

* @return an integer indicatint the comparison result

*  @see java.lang.Comparable#compareTo(Object)

*/

public int compareTo(

return GB2312Collator.compare(str1, str2);

}

}

测试代码及结果

代码:

import java.util.*;

import java.text.*;

public class Test

{

"作业",

"测试",

"test",

"我们",

"。空",

"镂空",

"[",

"浏",

"皙"

};

java.util.new ChineseGB2312Comparator());

"============");

for(

}

ChineseGB2312Comparator 类同时实现了 Comparator, Comparable 接口,这样以后能够使用 compare, compareTo 方法的时候都可以使用这个类。

二、VC++比较汉字

[别名]

CompareStringA

[说明]

根据用于特定“地方”环境的文本对比设置,对两个字串进行比较

[参数表]

LocaleLong,比较进行时的一个“地方”标识符

dwCmpFlagsLong,带 NORM_??? 前缀的一个或多个常数,它们定义了象“忽略大小写”这样的一些选项

lpString1String,要比较的第一个字串

cchCount1Long,以字节为单位指定字串长度(如果是DBCS字串,则没有字符)。如设为-1,表示进行自动计算(以NULL中止字符为准)

lpString2String,要比较的第二个字串

cchCount2Long,第二个字串的长度(参考 cchCount1 参数说明)

[返回值]

Long,如lpString1lpString2,则返回3。会设置GetLastError

[其它]

这个函数进行的比较要以特定的语言环境为基础,并不严格按照字符值进行比较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值