Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用for循环的脚本截断字符串的最后一个字母_Java - Fatal编程技术网

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

Java 使用for循环的脚本截断字符串的最后一个字母,java,Java,我编写了一个脚本,用于将句子中的每个字母与旁边的字母进行交换 例如,ABRACADABRA变成BARCADABARA。。。但是,有一个问题,当我编译脚本时,它会截断最后一个a,导致BARCADABARA。这会产生任何字符串,即使是那些没有以A结尾的字符串 /* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name o

我编写了一个脚本,用于将句子中的每个字母与旁边的字母进行交换

例如,
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);
    }
}
/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
/*只有当类是公共的时,类的名称才必须是“Main”*/
表意文字{
公共静态void main(字符串[]args)引发java.lang.Exception{
字符串word=“ABRACADABRA”;
字符串finalword=“”;
for(int i=0;i
问题的根源在于,您停止在倒数第二个字符处迭代字符串,但在可能的4种情况中,有3种情况下,您只在当前索引处添加字符,而忽略了最终索引处的字符

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

ABRACADABRA
         ^
wordsub
R
wordsub2
A
,但是您点击了else,只将
wordsub
添加到最后一个字符串中,然后循环终止,因为
i
不再小于长度-1

如果倒数第二个字母是“A”,而最后一个字母不是,这实际上会产生正确的结果,因为在这些条件下,if条件为true,并且两个字母都添加到最终字符串中

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

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

  • 更新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
    
    将按如下方式进行更改

    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
    
    当我阅读时,“我编写了一个脚本,用a替换句子中的每个字母和旁边的字母。”我认为字母“a”可以在字母的左边或右边

    您的if语句
    if(wordsub.equals(“A”)和&!wordsub2.equals(“A”)
    只检查字母“A”是否在左边而不是右边

    因此,在第一次迭代中,您将AB替换为BA,然后移动到R。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);
    }
    
    publicstaticvoidmain(字符串[]args)引发异常{
    字符串word=“ABRACADABRA”;
    字符串finalword=“”;
    for(int i=0;i
    结果:

    巴拉卡巴


    代码的问题在于,它没有遍历所有字符并提前结束1个字符。您可以通过简单地迭代所有字符并在检索下一个字符之前在字符串的末尾附加检查not Reach来解决这个问题。所以修改后的代码变成这样

    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 finalword=“”;
    for(int i=0;i
    作为一个副作用,我还发现有太多的字符串操作正在发生。您应该避免这样做,因为使用太多的字符串会消耗内存。您可以检查以下代码作为替代

    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());
    
    char-wordArr[]=word.toCharArray();
    StringBuilder finalWord=新的StringBuilder();
    int wordLength=wordArr.length;
    for(int i=0;i
    顺便说一句,在循环中连接字符串是一个坏主意,这可能会对更长的字符串造成严重的性能缺陷。考虑使用<代码> StringBuilder <代码>。这是AP计算机科学的实践…你认为
    StringBuilder
    是这个集合的一部分吗?我想没有,但是谢谢你@谢谢你的回答。构造得很好@seanlevan很高兴我能提供帮助。如果这听起来很无知,我很抱歉,但是解决我问题的代码修订部分在哪里?我只是找不到它…@seanlevan,不,一点也不无知。我的错误,我只是忘了添加代码。编辑我的答案,请检查。