我想替换与我的字符串数组中任何一个匹配的单词,我尝试了下面的代码,但它只替换了第一个条件,我相信这是因为返回语句,但我无法找出另一种方法来做到这一点。
public String wordsToCorrect (String word)
{
word = word.toLowerCase();
StringBuilder sb;
String[] bro =new String[5];
bro [0] = "bros";
bro [1] = "bro";
bro [2] = "bros";
bro [3] = "broda";
bro [4] = "brother";
String[] brother = bro;
String[] si = new String[6];
si [0] = "sis";
si [1] = "sister";
si [2] = "sista";
si [3] = "6sta";
si [4] = "sisy";
si [5] = "sissy";
String[] sister = si;
for ( int i=0;i < brother.length;i ++ )
{
if ( StringUtils.containsIgnoreCase(word, brother [i]) )
{
StrBuilder replace = new StrBuilder();
replace.append(word);
replace.append(" ");
replace.replaceAll(brother [i], "brother");
return replace.toString();
}
}
for ( int i= 0;i < sister.length;i++ )
{
if ( StringUtils.containsIgnoreCase(word, sister [i]) )
{
StrBuilder replace = new StrBuilder();
replace.append(word);
replace.append(" ");
replace.replaceAll(sister [i], "sister");
return replace.toString();
}
}
public String wordsToCorrect (String word)
{
StringBuilder sb;
String[] bro =new String[5];
bro [0] = "bros";
bro [1] = "bro";
bro [2] = "bros";
bro [3] = "broda";
bro [4] = "brother";
String[] brother = bro;
String[] si = new String[6];
si [0] = "sis";
si [1] = "sister";
si [2] = "sista";
si [3] = "6sta";
si [4] = "sisy";
si [5] = "sissy";
List<String> broList = Arrays.asList(bro);
List<String> sisList = Arrays.asList(si);
String[] words = word.split("\s");
for(int i=0; i<words.length; i++){
String singleWord = words[i];
if(broList.contains(singleWord.toLowerCase())){
words[i] = "brother";
}else if(sisList.contains(singleWord.toLowerCase())){
words[i] = "sister";
}
}
return String.join(" ", words);
}
编辑:添加说明
你的问题不只是循环结束。如果你想继续你的循环,你可以把"brother"中的"bro"替换成"brother",这样你就得到了"brother"。在我的代码中,首先按空格分割,这样就可以隔离每个单词,然后将其与要查找的单词进行匹配。我使用列表是因为使用contains更简单。此外,您不需要ignoreCase,因为您正在执行。tolower()(我更喜欢它在contains参数上,因为这不会改变原始字符串上的大写字母)。
这段代码可以很好地处理任何使用空格作为分隔符的字符串。如果你还需要使用换行符,你应该需要修改分割部分,并设法维护分隔符,可能使用类似于您的初始方法。
你在循环内部初始化StrBuilder,并且每次都初始化它,而且返回将退出循环/方法,调用将被发送回调用位置。
试试下面的代码
StrBuilder replace = new StrBuilder();
for ( int i=0;i < brother.length;i )
{
if ( StringUtils.containsIgnoreCase(word, brother [i]) )
{
replace.append(word);
replace.append(" ");
replace.replaceAll(brother [i], "brother");
}
}
return replace.toString(); // This return statement will also exit from the method, so seperate the brother and sister replacement in seperate methods/calls
把这个放到一个单独的方法中
StrBuilder replace1 = new StrBuilder();
for ( int i= 0;i < sister.length;i )
{
if ( StringUtils.containsIgnoreCase(word, sister [i]) )
{
replace1.append(word);
replace1.append(" ");
replace1.replaceAll(sister [i], "sister");
}
}
return replace1.toString();
我在这段代码中看到三个问题:1)循环变量不递增,2)"replace"重新初始化每个循环运行,3)返回结束你的方法。所以试试这个:
StrBuilder replace = new StrBuilder();
for (int i=0;i < brother.length;i++) {
if (StringUtils.containsIgnoreCase(word, brother [i])) {
replace.append(word);
replace.append(" ");
replace.replaceAll(brother [i], "brother");
}
}
return replace.toString();
然后对第二个循环进行相同的更改,并使其成为一个单独的方法