比如我将string作为CNN 文本处理输入:

      float [] input = new float[maxLength]; // 1 sentence by maxLenWords
// int[] input = new int[batchSize * maxLength]; // 1 sentence by maxLenWords
int i = 0;
final int length = subdomain.length();
for (int offset = 0; offset < length; ) {
final int codepoint = subdomain.codePointAt(offset); // do something with the codepoint
if(vocabMap.containsKey(codepoint)) {
input[i] = vocabMap.get(codepoint);
} else {
Log.e(TAG, "not found char in dict, check code point:" + codepoint + " subdomain:"+subdomain + " offset:" +offset);
}
i += 1;
offset += Character.charCount(codepoint);
}

其中,vocabMap为词汇表。构建方法:

         Gson gson = new GsonBuilder().setPrettyPrinting().create();
Type type = new TypeToken<Map<String, Integer>>(){}.getType();
Map<String,Integer> tmpMap = gson.fromJson(json, type);
vocabMap = new HashMap<Integer, Integer>();
maxLength = tmpMap.get("__MAX_DOC_LEN__");
volcabSize = tmpMap.get("__VOLCAB_SIZE__");
for (String s: tmpMap.keySet()) {
if (getPointLength(s) == 1) {
vocabMap.put(s.codePointAt(0), tmpMap.get(s));
} else {
Log.e(TAG, "****Check dict key:" + s + " point:" + s.codePointAt(0) + " point lenth=" + getPointLength(s));
}
}
Log.e(TAG, "load dict OK. maxLength:" + maxLength + " volcabSize:" + volcabSize + " DictSize:" + (vocabMap.size()));

注意每一次迭代都是int。

下面是详细解释:

循环遍历Java字符串的字符的规范方法:

final int length = s.length();
for (int offset = 0; offset < length; ) {
final int codepoint = s.codePointAt(offset); // do something with the codepoint offset += Character.charCount(codepoint);
}
http://stackoverflow.com/questions/1527856/how-can-i-iterate-through-the-unicode-codepoints-of-a-java-string
 

Java 正确遍历字符串

from:http://blog.csdn.net/l294265421/article/details/47281023
 

Java字符串是一系列的Unicode字符序列,但是,它却常常被误认为是char序列。于是,我们经常这样来遍历字符串:

  1. package testchar;
  2. public class TestChar2 {
  3. public static void main(String[] args) {
  4. String s = "\u0041\u00DF\u6771\ud801\uDC00";
  5. for(int i = 0; i < s.length(); i++) {
  6. System.out.println(s.charAt(i));
  7. }
  8. }
  9. }

然后,得到了意料之外的结果:

A

ß

?

?

之所以会这样,是因为Unicode字符和Java的char类型不能等同起来。实际上,Java中的char类型能表示的字符只是Unicode字符的子集,因为char只有16位,也就是说,它只能表示65536(2的16次方)个字符,但实际的Unicode字符数超过这个数字。在Java中,用UTF-16编码char和String中的字符,一个字符对应的编码值被称为一个代码点。有的代码点用16位编码,被称为一个代码单元,像char表示的那些字符;有的代码点用32位编码,也就是用两个连续的代码单元编码,如上文中的\ud801\uDC00。其实,我们遍历一个字符串,遍历的是这个字符串中所有代码点,而

s.length()

返回的是字符串s中代码单元的个数。当i对应的代码单元只是一个32位代码点的一部分时,

s.charAt(i)

也就不能像我们希望的那样工作了。

    package testchar;  

    /**
* 正确遍历String
*
* @author yuncong
*
*/
public class TestChar { public static void main(String[] args) {
String s = "\u0041\u00DF\u6771\ud801\uDC00";
// 获得字符串中代码点的数量
int cpCount = s.codePointCount(0, s.length());
for (int i = 0; i < cpCount; i++) {
int index = s.offsetByCodePoints(0, i);
int cp = s.codePointAt(index);
if (!Character.isSupplementaryCodePoint(cp)) {
System.out.println((char) cp);
} else {
System.out.println(cp);
}
} System.out.println("-------------------"); for (int i = 0; i < s.length(); i++) {
int cp = s.codePointAt(i);
if (!Character.isSupplementaryCodePoint(cp)) {
System.out.println((char) cp);
} else {
System.out.println(cp);
i++;
}
} System.out.println("-------------------"); // 逆向遍历字符串
for(int i = s.length() - 1; i >= 0; i--) {
int cp = 0;
// 当i等于0的时候,只剩下一个代码单元,不可能是辅助字符
if (i == 0) {
cp = s.codePointAt(0);
System.out.println((char)cp);
} else {
// 只有在i大于0的时候才可以退,并且
// 因为剩下的代码单元大于2,所以接下
// 来访问的两个代码单元可能表示辅助
// 字符;
// 退一个代码单元
i--;
cp = s.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp)) {
System.out.println(cp);
} else {
// 如果cp不是辅助字符,就回到遍历的正常位置
i++;
cp = s.codePointAt(i);
System.out.println((char)cp);
}
}
} } }

循环遍历Java字符串字符的规范方法——类似python for ch in string的更多相关文章

  1. Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次

    [请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...

  2. 使用位运算、值交换等方式反转java字符串-共四种方法

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  3. {转}Java 字符串分割三种方法

    http://www.chenwg.com/java/java-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%86%E5%89%B2%E4%B8%89%E7%A7%8D%E6%9 ...

  4. JAVA字符串缓存器全部方法功能及其作用

    不知道干嘛的 serialVersionUID 构造一个没有字符的字符串缓冲区,初始容量为16个字符. StringBuffer() 构造一个没有字符的字符串缓冲区和指定的初始容量. StringBu ...

  5. ArrayList循环遍历并删除元素的几种情况

    如下代码,想要循环删除列表中的元素b,该怎么处理? public class ListDemo { public static void main(String[] args) { ArrayList ...

  6. 普通for循环遍历LinkedList弊端

    java开发过程中,用到的最多的List集合就属ArrayList与LinkedList.对于ArrayList的遍历,通常是下面的方法: public static void main(String ...

  7. python字符串内容替换的方法(转载)

    python字符串内容替换的方法 时间:2016-03-10 06:30:46来源:网络 导读:python字符串内容替换的方法,包括单个字符替换,使用re正则匹配进行字符串模式查找与替换的方法.   ...

  8. Java中字符转int

    Java中字符转int 方法一代码: //直接使用静态方法,不会产生多余的对象,但会抛出异常 //parseInt 方法都有两个参数, 第一个参数就是要转换的对象, 第二个参数是进制基数, 可以是 2 ...

  9. Java基础 之 System.getProperty()方法

    Java基础 之 System.getProperty()方法大全 public static void main(String[] args) { System.out.println(" ...

随机推荐

  1. c#——值类型与引用类型

    值类型传的是值 引用类型传的是地址

  2. PHP 之文件锁解决并发问题

    一.参数说明 $handle: 文件资源 $operation: 锁的类型 LOCK_SH: 共享锁 LOCK_EX: 排他锁 LOCK_UN: 释放锁 $wouldblock: 设置为true的时候 ...

  3. drf07 过滤 排序 分页 异常处理 自动生成接口文档

    4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...

  4. 一步一步教你用IntelliJ IDEA 搭建SSM框架(2)——配置mybatis-geneator

    我们要搭建整个SSM框架,所以要继续上篇文章没有完成的工作,下面配置mybatis-geneator,自动生成mybatis代码. 在上篇文章中的pom.xml的配置文件中已经加了mybatis-ge ...

  5. final关键字用法

    Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法 ...

  6. centos 7中 yum安装jdk

    yum安装jdk的好处就是不需要手动再配置环境变量,所有的变量都是自动生成 1.检查系统是否存在jdk,存在删除原版jdk 如果没有信息输出,则表示没有安装jdk rpm -qa |grep java ...

  7. HTML学习笔记之标签基础

    目录 1.基本标签 2.链接 3.图像 4.表格 5.列表 6.块与布局 1.基本标签 (1)标题与段落 标签 <h1> ~ <h6> 分别用于定义一至六级标题,标签 < ...

  8. springcloud(七): 使用Feign调用Eureka Server客户端服务

    当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻. ...

  9. js调用ro的webservice

    Enabling JavaScript Access on the Server Drop the JavaScriptHttpDispatcher component onto the server ...

  10. 【codeforces 760D】Travel Card

    [题目链接]:http://codeforces.com/contest/760/problem/D [题意] 去旅行,有3种类型的乘车票; 第一种:只能旅行一次20元 第二种:按时间计算,90分钟内 ...