java.text.BreakIterator 类用来查找不同语言中的字符、单词和句子的边界。因为不同的语言有不同的字、单词和句子的边界,所以只是查找空格、逗号、句号、分号和冒号是不够的。你需要一个万无一失的、可用于各种语言的查找方法。BreakIterator 类就是干这个的。

创建一个 BreakIterator
一个 BreakIterator 实例只能判断以下四种边界之一:

字符边界
单词边界
句子边界
行边界
首先需要使用BreakIterator类提供的用于识别以上边界的,对应的工厂方法来创建一个实例。这些工厂方法有:

BreakIterator.getCharacterInstance();
BreakIterator.getWordInstance();
BreakIterator.getSentenceInstance();
BreakIterator.getLineInstance();

每个方法都需要一个 Locale 作为参数,然后返回一个 BreakIterator 实例,例如:

Locale locale = LocaleUK;BreakIterator breakIterator =BreakIterator.characterInstance(locale);

字符边界
当查找一个字符边界时,需要区分用户字符和Unicode字符。

一个用户字符是指用户用笔书写时或者用户通常在屏幕上看到了字符。

一个用户字符通常需要一个或多个Unicode字符去表示;有的需要2个或更多的Unicode字符来表示。

一个 BreakIterator 的字符实例可以用于查找用户字符的边界,而不是Unicode字符。

例如,以下例子用来查找一个字符串的字符边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getCharacterInstance(locale);breakIterator.setText("Mary had a little Android device.");int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {System.out.println(boundaryIndex) ;boundaryIndex = breakIterator.next();
}

上例创建了一个用于英式英语的 BreakIterator 实例,然后调用setText() 方法指定用于查找的文本内容。

first() 方法返回找到的第一个断点,方法 next() 用于查找所有接下来的断点。这两个方法都返回查找到的用户字符中的Unicode字符索引。因此,如果一个用户字符占用了多于一个的Unicode字符,那么字符的索引会增加占用的Unicode字符数。

单词边界
当查找单词时,需要创建一个符合单词边界的、针对特定语言的BreakIterator 实例,下面是一个示例:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getWordInstance(locale);

以上代码创建一个用于查找英国英语中单词边界的 BreakIterator 实例。
下面的例子演示了怎么查找一段英语文本的单词边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getWordInstance(locale);breakIterator.setText("Mary had a little Android device.");int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {System.out.println(boundaryIndex) ;boundaryIndex = breakIterator.next();
}

同样的,first() 和 next() 方法返回查找到单词的Unicode字符的索引。

用Java统计特定语言中的单词数Counting Words in a Specific Language in Java
这个Java代码片段显示了如果统计某个特定语言中的单词数:

public class WordCounter {public static class  WordCount {protected String word  = null;protected int    count = 0;}public static Map<String, WordCount> countWords(String text, Locale locale) {Map<String, WordCount> wordCounts = new HashMap<String, WordCount>();BreakIterator breakIterator = BreakIterator.getWordInstance(locale) ;breakIterator.setText(text);int wordBoundaryIndex = breakIterator.first();int prevIndex         = 0;while(wordBoundaryIndex != BreakIterator.DONE){String word = text.substring(prevIndex, wordBoundaryIndex).toLowerCase();if(isWord(word)) {WordCount wordCount = wordCounts.get(word);if(wordCount == null) {wordCount = new WordCount();wordCount.word = word;}wordCount.count++;wordCounts.put(word, wordCount);}prevIndex = wordBoundaryIndex;wordBoundaryIndex = breakIterator.next();}return wordCounts;}private static boolean isWord(String word) {if(word.length() == 1){return Character.isLetterOrDigit(word.charAt(0));}return !"".equals(word.trim());}
}

方法countWords() 需要一个 string 参数和一个 Locale 参数。Locale 代码了传入的string的语言类别。因此,当创建 BreakIterator,它可以创建针对那个语言类型的实例。

这个方法统计了一个单词在传入的串中有多少个,然后返回一个 Map<String, WordCount> 对象,Map中的key是一个一个单词,以小写形式表示,值是一个 WordCount 实例,它包含了两个变量:word 和 count 。只需要把所有的单词发生的次数相加就可以得到总的单词数了。

注意:isWord() 方法中是怎么使用 Character.isLetterOrDigit() 方法来判断某个字符是字母还是数字的,或者是其他的(例如分号,引号等)。Character.isLetterOrDigit()方法检查对应的unicode characters 是字母还是数字,并且不仅仅用在英语上,也可以用于其他语言。关于这个方法和其他的一些类似的方法的更详细的描述,可以参考:Characeter Methods 。

句子边界
对于特定语言的句子边界,需要创建一个BreakIterator 针对那种语言的句子边界实例:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getSentenceInstance(locale);

以上代码创建了一个针对英国英语的 BreakIterator 句子实例。
以下示例查找英语文本中的句子边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getSentenceInstance(locale);breakIterator.setText("Mary had a little Android device. " +"It had small batteries too.");int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {System.out.println(boundaryIndex) ;boundaryIndex = breakIterator.next();
}

行边界
也可以查找某段文本中的新行而不中断文本的阅读。这个时候需要一个拥有用于侦探潜在的行边界的BreakIterator 实例。注意:这并不能找到直接的行断点,而是潜在的行断点。找到潜在的行中断是需要把文本划分成多行显示的时候相当有用,即使这段文本不包括任何显示的分行。以下是一个创建这个的 BreakIterator 实例的例子:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getLineInstance(locale);

这个例子创建一个拥有英式英语的潜在的行分割通用的 BreakIterator 实例。

下面的例子用于查找潜在的行分割:

Locale locale = Locale.UK;
BreakIterator breakIterator =BreakIterator.getLineInstance(locale);breakIterator.setText("Mary had a little Android device.\n " +"It had small batteries too.");int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {System.out.println(boundaryIndex) ;boundaryIndex = breakIterator.next();
}

Java国际化:BreakIterator相关推荐

  1. java 国际化_Java国际化基础

    关于本教程 本教程是关于什么的? 本教程向您介绍Java编程语言对多语言和多国家/地区环境的支持. 本课程首先对国际化原则和概念进行一般性讨论,然后继续对Java国际化支持的特定领域进行概述. 最后几 ...

  2. JAVA国际化教程【转载】

    JAVA国际化教程1.关于本教程 2.简介 3.Java平台I18N支持概述 4.Unicode与Java字符 5.提供本地化的资源 6.使用日期.数字和货币 7.将各部分放到一起 8.结束语与参考资 ...

  3. java国际化——资源包

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 旨在理解 java国际化--资源包 的基础知识 : 2) 本文源代码idea 转自: (利用propertie ...

  4. java国际化——消息格式化+文本文件和字符集

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--消息格式化+文本文件和字符集 的基础知识 : 2) 由于本文 ...

  5. java国际化——日期和时间+排序

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--日期和时间+排序 的基础知识 : [1]日期和时间 1)当格 ...

  6. java国际化——Locale+数字格式

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--Locale+数字格式 的基础知识 : 2) java 编程 ...

  7. Java国际化概念和使用介绍

    国际化是商业软件系统的一个基本要求,因为当今的软件系统需要面对全球的浏览者.国际化的目的就是根据用户的语言环境的不同向用户输出与之相应的页面,以示友好. 程序国际化已成为 Web 应用的基本要求.随着 ...

  8. java国际化 英语的标识符_(转)Java 国际化

    1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...

  9. java国际化程序_Java 国际化标准程序实现

    国际化程序实现 所谓的国家化应用指的就是根据当前的语言环境读取指定的语言资源文件. 如果要想实现国际化的操作,那么首先要解决的问题就是如何读取资源文件的问题:所谓的资源文件 就是指文件后缀名称为:&q ...

最新文章

  1. android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...
  2. 网站运营之做到SEO操作视频教程【21讲】
  3. 安装使用大key工具rdb_bigkeys
  4. 初学者万年历c语言源代码,C语言万年历的源程序
  5. cs1.5 linux服务端,Linux下架设CS1.5服务器
  6. 基于jQuery/zepto的单页应用(SPA)搭建方案
  7. SEO之网站内链优化策略
  8. php常用判断蜘蛛的代码
  9. 给初创业者的几点建议
  10. ligerGrid简单例子--通过后台转数据
  11. 如何使用矩池云的保存环境功能
  12. Jfinal中使用Ueditor遇到的问题【解决办法】
  13. 【干货分享】迄今为止最好用的编程字体-支持中文正确显示:同时彻底解决eclipse中文注释缩进排版混乱问题
  14. 使用matplotlib动态打印图片(RGB图片)
  15. 常用元器件使用方法5:RS-232电平转换芯片SP3232EEN的使用方法
  16. 微软中国招聘职位描述(英文)
  17. 30天自制操作系统——自写设计
  18. MyCat权威指南阅读笔记(进阶篇)
  19. ES使用Ngram分词器实现wildcard高性能替代方案
  20. 安装XAMPP端口冲突问题

热门文章

  1. 网络基础笔记(四)不同网段通信
  2. 《MFC如何屏蔽ESC和Enter按键退出应用程序》
  3. ireport4.5在JVM中添加新字体解决方案(Font ‘標楷體‘ is not available to the JVM. See the Javadoc for more details.)
  4. CVPR2022 目标检测方向文章(附摘要)
  5. 8 9区别 endnote7_带鱼5-7和8-9的区别
  6. 独享服务器做系统,独享服务器的含义与好处
  7. 为什么没有参数的函数(与实际函数定义相比)会编译?
  8. 3M年度调查显示,疫情挑战下中国受访者对科学的信任度居全球首位
  9. DOCKER里面PYTORCH关于GLOO地址声明 NCCL地址声明
  10. 采用html 的a标签,href连接为文件时无法下载解决方案