我遇到了一些我不知道如何修复的java代码的问题。我想知道我是否可以找到一些帮助,弄清楚为什么我一直在
java.lang.StringIndexOutOfBoundsException: String index out of range: 1
这是弹出问题的代码片段(它是作业的一个更大的包的一部分......):
public class MyMapper extends Mapper {
@Override
//method takes docName and data as string
public void map(String documentID, String document) {
//this string array hold all the delimiters for our split
//String[] separators = {",", ".", "!", "?", ";", ":", "-", "' "," "};
//splits the string 'document' according to delimiters
String[] words = document.split(",|\\.|\\!|\\?|\\;|\\:|\\-|\\' |\\ |\\'.");
// for each word in String[] words, check that each word is legitimate
for (String word : words) {
if (isAlpha(word)){
//System.out.println(word);
emit(word.substring(0, 1).toUpperCase() , "1");
}
else;
}
}
// private helper method to check that each word is legitimate (alphas-only)
private boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if(!Character.isLetter(c)) {
return false;
}
}
return true;
}
}
我要做的是接收一个文档(通过bufferedReader以字符串形式存储)并抓住文档中每个单词的第一个字母,并将它们大写。
*****更新了代码*****
我决定在私人助手方法中使用建议检查空的“单词”。现在一切都有效。
以下是用于文档目的的更新代码:
// private helper method to check that each word is legitimate (alphas-only)
private boolean isAlpha(String name) {
if (name.equals(""))
return false;
char[] chars = name.toCharArray();
for (char c : chars) {
if(!Character.isLetter(c)) {
return false;
}
}
return true;
答案 0 :(得分:1)
有时您的word
似乎是空的。首先进行检查,看看您是否有需要处理的事项:
if (isAlpha(word)){
if(!word.isEmpty()){ //you could also use 'if(word.length == 0)'
emit(word.substring(0, 1).toUpperCase() , "1");
}
}
或者,在isAlpha()方法中进行检查。
答案 1 :(得分:1)
如果你的单词是空的,只需从你的isAlpha()中返回一个假的
private boolean isAlpha(String name) {
if (name.equals(""))
return false;
char[] chars = name.toCharArray();
for (char c : chars) {
if(!Character.isLetter(c)) {
return false;
}
}
return true;
}
}
答案 2 :(得分:1)
对于某些字符串,您的split
正则表达式可以生成空字符串,例如,在逗号后面跟一个空格的不常见的情况下,例如,字符串document = "Some words, with comma.";
将是分成[Some, words, , with, comma]
。
我建议使用\W
字符类(非字母数字字符),并允许其中的多个,即words = document.split("\\W+");
,而不是枚举您可以想到的所有非单词字符。这样就可以[Some, words, with, comma]
。
如果您需要更多地控制要分割的字符并且不想使用字符类,您仍然可以将字符放入[...]+
以缩短正则表达式并按分割使用words = document.split("[|.!?,;:' -]+")
的那些组。 (在[...]
内,只要-
是最后一个,你就不需要逃避所有这些,所以它是明确的。)
答案 3 :(得分:0)
会这样吗?
String text = "es saß ein wiesel, auf einem kiesel.";
String[] parts = text.split("\\s+");
StringBuilder resultingString = new StringBuilder();
for (String part : parts) {
part = Character.toUpperCase(part.charAt(0))
+ part.substring(1, part.length());
resultingString.append(part + " ");
}
text = resultingString.toString().substring(0,
resultingString.length() - 1);
System.out.println(text);