为什么在Java中尝试反转字符串时会出现类型不匹配?

为什么在Java中尝试反转字符串时会出现类型不匹配?,java,arrays,string,Java,Arrays,String,所以,我一直是一个新手程序员,但最近决定学习Java。我只是在摆弄一个小构造器,这个构造器接收一个字符串,然后将其向后写入(我这样做的方法根本不被认为是有效的,我只是在使用我可以使用的不同工具以适应它。)我的错误是在试图将数组中的字符添加到字符串时出现的。代码如下: public class dids { char letters[]; public dids(String thing) { letters= new char[thing.length

所以,我一直是一个新手程序员,但最近决定学习Java。我只是在摆弄一个小构造器,这个构造器接收一个字符串,然后将其向后写入(我这样做的方法根本不被认为是有效的,我只是在使用我可以使用的不同工具以适应它。)我的错误是在试图将数组中的字符添加到字符串时出现的。代码如下:

public class dids {

    char letters[];

    public dids(String thing)
    {
        letters= new char[thing.length()];  
        for(char x:letters){
            letters[x] = thing.charAt(x);
        }
        for(int i=thing.length();i>0;i--){
            String retval += letters[i];
        }
    }
}

错误是无法将字符添加到字符串中。类型不匹配。

您没有告诉我们错误是什么

我指出以下几点:

  • 用于(字符x:字母){

    这种形式的
    for
    循环将迭代
    字母中的每个字符。因此,
    x
    将被设置为
    字母中的每个字符。但是,您试图将其用作索引-这是可以的,因为
    char
    可以转换为
    int
    。但是,由于您从未初始化数组o对于字符(
    letters
    ),对于
    x
    ,您总是会得到一个值
    0
    。这意味着您总是设置
    letters
    的第一个元素,覆盖上一个元素

  • for(int i=thing.length()…

    由于数组是0索引的,
    length
    总是比最后一个元素的索引多一个。因此,通过使用数组的长度访问数组,您超出了1的界限。您应该将
    i
    初始化为
    thing.length()-1

  • String retval+=字母[i];

    编译失败-无法声明和追加。
    retval
    应在for循环之外声明

  • public void dids(String thing) {
        System.out.println(thing);
        char letters[];
    
    
        letters =  thing.toCharArray();
        String retval = "";
        for (int i = thing.length()-1; i >= 0; i--) {
            retval = retval + letters[i];
    
        }
        System.out.println(retval);
    
    }
    

    下面是对代码的修复,它使用了
    tocharray()
    方法,可用于
    String
    对象:

    public dids(String thing)
    {
        letters= thing.toCharArray();
    
        String retval = "";
        for(int i=thing.length()-1;i>=0;i--){
             retval += letters[i];
        }
    
    }
    

    更有效的解决方案可能是:

    public dids(String thing)
    {
        StringBuilder sb = new StringBuilder();
        for(int i = thing.length()-1; i >=0; i-- )
        {
            sb.append(thing.charAt(i));
        }
    }
    
    这更好,因为

    a、
    String
    s是不可变的,这意味着一旦创建它们就不能修改(除非您使用反射)每次附加到字符串时,实际上是在创建一个新对象,在这种情况下这是一种浪费。
    StringBuilder
    StringBuffer
    用于更改字符序列的情况


    b、 由于可以逐个字符访问
    字符串,因此实际上不需要创建字符串的字符数组表示来反转字符串。

    您需要在for循环之外声明retval:

    public dids(String thing)
    {
    
    letters= new char[thing.length()];  
    for(int x=0;x<letters.length;x++){//using index instead of char
        letters[x] = thing.charAt(x);
    }
    String retval=""
    for(int i=thing.length()-1;i>=0;i--){//fixing of by one
         retval+= letters[i];
    
    }
    
    }
    
    公共DID(字符串)
    {
    字母=新字符[thing.length()];
    对于(int x=0;x=0;i--){//按1固定
    retval+=字母[i];
    }
    }
    
    否则,每次循环运行时都会重新创建并丢弃它


    我还修复了一些其他错误。在您的示例中有多个错误。我已经修复了代码并使其更好地工作。主要错误是,您在for循环中声明了retval变量

    public void dids(String thing) {
        System.out.println(thing);
        char letters[];
    
    
        letters =  thing.toCharArray();
        String retval = "";
        for (int i = thing.length()-1; i >= 0; i--) {
            retval = retval + letters[i];
    
        }
        System.out.println(retval);
    
    }
    

    在Java中,我会这样做(注意,这仍然是非常讨厌的,实际上我只是想从库中得到一些东西,但是你明白了

    public class Dids {
    
        private String _thing;  
    
        private String _reversed = "";
    
        public Dids(String thing) {             
            _thing = thing;             
        }
    
        public void reverse() {         
            for(int i=_thing.length()-1 ;i>-1; i--){
                _reversed += _thing.charAt(i);
            }
        }
    
        public String getReversed() {
            return _reversed;
        }
    }
    
    public class ReverseTester {
    
        public static void main(String[] args) {    
            String test = "abcd";
    
            Dids dids = new Dids(test);
            dids.reverse();
    
            System.out.println(dids.getReversed());
        }
    }
    
    您希望使用String.tocharray填充数组,如下所示:

    letters=thing.toCharArray();

    下面的代码将字符串反转

    StringBuilder sb = new StringBuilder(thing);  
    sb = sb.reverse();  
    String retval = sb.toString();
    

    这有点令人困惑,但是循环的
    中都有两个错误

    在第一种情况下,您使用
    x
    作为索引。
    x
    char
    而不是
    int
    (好吧,您可能想看看原语转换,因为这可能很棘手)。在每次迭代的第一个循环中,
    x
    将被更新,并在
    字母[]
    中包含“下一个”字符


    在第一次迭代的第二个循环中,将出现“IndexOutOfBoundException”。数组的最后一个元素等于它的长度-1,因为数组基于0!

    对不起,我在倒数第二句中试图避开它,但不清楚。错误是我无法向字符串添加字符。类型不匹配。@Sam请查看我的u更新的答案-您不能在同一语句中声明和追加,您应该在循环外声明
    retval
    。此外,代码中还有其他问题会导致它无法按预期工作。它肯定称为StringBuilderReh?什么叫StringBuilder?您建议在Java API提供可以将对象转换为字符串的反转方法。啊,谢谢,我在commons StringUtilsI中考虑了反转方法。我将您的问题标题编辑为更具描述性的内容…请随意再次编辑。此外,我还尝试包含“错误消息”从您的注释中-但是您应该简单地复制问题中编译器的实际错误消息。(编译器肯定不会输出
    ,我不能向字符串添加字符