在Java中迭代字符串字符的方法有:
使用StringTokenizer ? 将String转换为char[]并对其进行迭代。
最简单/最好/最正确的迭代方法是什么?
在Java中迭代字符串字符的方法有:
使用StringTokenizer ? 将String转换为char[]并对其进行迭代。
最简单/最好/最正确的迭代方法是什么?
当前回答
两个选项
for(int i = 0, n = s.length() ; i < n ; i++) {
char c = s.charAt(i);
}
or
for(char c : s.toCharArray()) {
// process c
}
第一种可能更快,第二种可能更易读。
其他回答
public class Main {
public static void main(String[] args) {
String myStr = "Hello";
String myStr2 = "World";
for (int i = 0; i < myStr.length(); i++) {
char result = myStr.charAt(i);
System.out.println(result);
}
for (int i = 0; i < myStr2.length(); i++) {
char result = myStr2.charAt(i);
System.out.print(result);
}
}
}
输出:
H
e
l
l
o
World
我使用一个for循环来迭代字符串,并使用charAt()来获取每个字符以检查它。由于String是用数组实现的,charAt()方法是一个常量时间操作。
String s = "...stuff...";
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
//Process char
}
这就是我要做的。对我来说这似乎是最简单的。
至于正确性,我不相信这里存在。这完全取决于你的个人风格。
我同意StringTokenizer在这里是多余的。事实上,我尝试了上面的建议,并花了时间。
我的测试相当简单:创建一个带有大约一百万个字符的StringBuilder,将其转换为String,并在转换为char数组/使用CharacterIterator一千次之后使用charAt()遍历每个字符(当然要确保对字符串做一些事情,这样编译器就不能优化掉整个循环:-))。
在2.6 GHz的Powerbook(那是mac:-))和JDK 1.5上的结果:
测试1:charAt +字符串——> 3138msec 测试2:字符串转换为数组——> 9568msec 测试3:StringBuilder charAt——> 3536msec 测试4:CharacterIterator和String——> 12151msec
由于结果明显不同,最直接的方法似乎也是最快的方法。有趣的是,StringBuilder的charAt()似乎比String的charAt()稍慢。
顺便说一句,我建议不要使用CharacterIterator,因为我认为它滥用'\uFFFF'字符作为“迭代结束”是一个非常糟糕的hack。在大型项目中,总是有两个人为了两个不同的目的使用同一种黑客,代码就会神秘地崩溃。
下面是其中一个测试:
int count = 1000;
...
System.out.println("Test 1: charAt + String");
long t = System.currentTimeMillis();
int sum=0;
for (int i=0; i<count; i++) {
int len = str.length();
for (int j=0; j<len; j++) {
if (str.charAt(j) == 'b')
sum = sum + 1;
}
}
t = System.currentTimeMillis()-t;
System.out.println("result: "+ sum + " after " + t + "msec");
如果你需要遍历字符串的代码点(见这个答案),一个更短/更可读的方法是使用Java 8中添加的CharSequence#codePoints方法:
for(int c : string.codePoints().toArray()){
...
}
或者直接使用流而不是for循环:
string.codePoints().forEach(c -> ...);
如果你想要字符流,还有CharSequence#chars(尽管它是IntStream,因为没有CharStream)。
我不会使用StringTokenizer,因为它是JDK遗留的类之一。
javadoc说:
StringTokenizer是一个遗留类 出于兼容性原因而保留 尽管在new中不鼓励使用 代码。建议任何人 查找此功能,请使用 的split方法 regex包代替。