使用for循环的脚本截断字符串的最后一个字母

时间:2015-05-07 02:02:08

标签: java

我编写了一个脚本来交换句子中的每个字母,其中A带有旁边的字母。

例如,ABRACADABRA变为BARCADABARA ...但是,存在一个问题,即当我编译脚本时,它会截断最终的A,从而产生BARCADABARA。这导致任何字符串,甚至是那些不以A结尾的字符串。

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone {

    public static void main (String[] args) throws java.lang.Exception {

        String word = "ABRACADABRA";
        String finalword = "";

        for (int i = 0; i < word.length()-1; i++) {

            String wordsub = word.substring(i, i+1);
            String wordsub2 = word.substring(i+1, i+2);

            if(wordsub.equals("A") && !wordsub2.equals("A")){
                i++;
                finalword = finalword + wordsub2;
                finalword = finalword + wordsub;
            } else {
                finalword = finalword + wordsub;
            }
        }

        System.out.println(finalword);
    }
}

4 个答案:

答案 0 :(得分:1)

问题的根源是你在第二个到最后一个字符处停止迭代字符串,但在可能的4个案例中有3个你只在当前索引处添加字符,忽略最终索引处的字符。

i位于倒数第二个索引时:

ABRACADABRA
         ^

wordsubRwordsub2A,但是您点击了其他内容并且只将wordsub添加到最后一个字符串,然后循环终止,因为i不再小于长度 - 。

这实际上产生了正确的结果,因为倒数第二个字母是'A'而最后一个字母不是因为在这些条件下if条件为真且两个字母都被添加到最终字符串。

我认为有两种简单的方法可以解决这个问题:

  1. 迭代到字符串的末尾并添加更多逻辑以防止wordsub2获得StringIndexOutOfBoundsException
  2. 在循环外定义wordsub2并添加一个在循环内设置的标志,以指示是否需要将其添加到finalword的末尾。

答案 1 :(得分:1)

您的代码存在的问题是,它不会迭代所有字符并提前结束1个字符。您可以通过简单地遍历所有字符并在检索下一个字符之前对字符串末尾进行额外检查来解决此问题。所以你修改过的代码就像这样

String finalword = "";

for (int i = 0; i < word.length(); i++) {

    String wordsub = word.substring(i, i+1);

    if( (i+1) == word.length()){
        finalword = finalword + wordsub;
        break;
    }

    String wordsub2 = word.substring(i+1, i+2);
    if(wordsub.equals("A") && !wordsub2.equals("A")){
         i++;
         finalword = finalword + wordsub2;
         finalword = finalword + wordsub;
     } else {
         finalword = finalword + wordsub;
     }
}

作为一个副作用,我还发现有太多的字符串操作正在发生。你应该避免这种情况,因为使用过多的String会占用内存。您可以查看以下代码作为替代方案。

char wordArr[] = word.toCharArray();
StringBuilder finalWord = new StringBuilder();
int wordLength = wordArr.length;

for(int i=0; i < wordLength; i++){

    if( (wordArr[i]=='A') && (i!=wordLength-1)){
        finalWord.append(wordArr[i+1]);
        finalWord.append(wordArr[i]);
        i++;
    }else{
        finalWord.append(wordArr[i]);
    }

}
System.out.println(finalWord.toString());

答案 2 :(得分:0)

按如下方式更新else部分

else{
  finalword = finalword + wordsub;
  finalword = finalword + wordsub2;
}

更改将按如下方式进行

ABRACADABRA
A B
BA
R A
A C
BARACA
A D
BARACADA
A B
BARACADABA
R A
-------------------BARACADABARA

答案 3 :(得分:0)

当我读到时,“我编写了一个脚本,用一个句子中的每个字母交换,旁边有一个字母。”我认为字母“A”可以在字母的左侧或右侧。

如果声明if(wordsub.equals("A") && !wordsub2.equals("A"))仅检查字母“A”是否在左侧而不在右侧。

因此,在第一次迭代中,您将AB交换为BA然后移至R. Well R位于A(RA)旁边,但A位于右侧而不是左侧,这使得if语句失败。在if语句中添加||子句以解释此问题。

public static void main(String[] args) throws Exception {

    String word = "ABRACADABRA";
    String finalword = "";

    for (int i = 0; i < word.length()-1; i++) {

        String wordsub = word.substring(i, i+1);
        String wordsub2 = word.substring(i+1, i+2);

        if((wordsub.equals("A") && !wordsub2.equals("A")) ||
           (!wordsub.equals("A") && wordsub2.equals("A"))) {
            i++;
            finalword = finalword + wordsub2;
            finalword = finalword + wordsub;
        } else {
            finalword = finalword + wordsub;
        }
    }

    System.out.println(finalword);
}

结果:

  

BAARACADBAR