【问题标题】:Why do I get a type mismatch when trying to reverse a string in Java?为什么在 Java 中尝试反转字符串时会出现类型不匹配?
【发布时间】:2011-08-27 23:22:18
【问题描述】:

所以,我一直是一名新手程序员,但最近决定学习 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];
        }
    }
}

错误是说我不能将字符添加到字符串中。类型不匹配。

【问题讨论】:

  • 我编辑了您的问题标题,使其更具描述性......随时再次编辑。此外,我尝试在您的评论中包含“错误消息” - 但您应该简单地从问题中复制编译器的实际错误消息。 (编译器肯定不会输出I cannot add a char to a string。)

标签: java arrays string


【解决方案1】:
public class dids { //classes start with an upper case letter (Dids not dids)

char letters[];

public dids(String thing)
{

letters= new char[thing.length()];  //No null check can throw NPE
for(char x:letters){ //letters is an empty array.  
    letters[x] = thing.charAt(x);  
}
for(int i=thing.length();i>0;i--){//style is to count up
    String retval += letters[i]; //retval is recreated every time

}

}

}   

你想像这样使用 String.toCharArray 来填充你的数组:

letters = thing.toCharArray();

下面的代码反转一个字符串。

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

【讨论】:

    【解决方案2】:

    你需要在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];
    
    }
    
    }
    

    否则每次循环运行时都会重新创建并丢弃它

    我还修复了一些其他错误

    【讨论】:

      【解决方案3】:

      您的示例中有多个错误。我已经修复了代码并使其更好地工作。主要错误是,您在 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);
      
      }
      

      【讨论】:

        【解决方案4】:

        在 Java 中我会这样做(注意这仍然很讨厌,真的我只是来自 commons 库的东西,但你明白了

        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());
            }
        }
        

        【讨论】:

        • 它绝对叫 StringBuilder
        • 嗯?什么叫StringBuilder?
        • 您建议使用 Apache commons,因为 Java API 提供了一种反转可以转换为字符串的对象的方法。
        • 啊,谢谢,正在考虑公共StringUtils中的反向方法
        【解决方案5】:

        这有点令人困惑,但for loops 都有两个错误。

        首先使用x 作为索引。 x 正如您使用 char x 定义的那样,是 char 而不是 int(好吧,也许您可​​能想看看原语转换,因为这可能很棘手)。在每次迭代的第一个循环中,x 将被更新并在letters[] 中包含“下一个”字符。

        在第一次迭代的第二个循环中,会有一个 `IndexOutOfBoundException'。数组的最后一个元素等于它的长度为 1,因为数组是基于 0 的!

        【讨论】:

          【解决方案6】:

          你还没有告诉我们错误是什么。

          我发现了以下内容:

          1. for(char x:letters){
            这种形式的for 循环将遍历letters 中的每个字符。因此,x 将被设置为letters 中的每个字符。但是,您正在尝试将其用作索引 - 这有点好,因为 char 可以转换为 int。但是,由于您从不初始化字符数组 (letters),因此对于 x,您将始终获得 0 的值。这意味着您总是设置letters 的第一个元素,覆盖前一个元素。

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

          3. String retval += letters[i];
            这无法编译 - 您不能声明 附加。 retval 应该在 for 循环之外声明。


          以下是对您的代码的修复,它利用了可用于 String 对象的 toCharArray() 方法:

          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));
              }
          }
          

          这样更好,因为

          一个。 Strings 是不可变的,这意味着一旦创建它们就无法修改(除非您使用反射),并且每次附加到字符串时,您实际上是在创建一个新对象,这在这种情况下是浪费的。 StringBuilderStringBuffer 用于您想要更改字符序列的情况。

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

          【讨论】:

          • 对不起,我在倒数第二句中试图逃避它,但不清楚。错误是说我不能将字符添加到字符串中。类型不匹配。
          • @Sam 请看我更新的答案——你不能在同一个语句中声明和附加,你应该在循环外声明retval。此外,您的代码还有其他问题会导致它无法按预期工作。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-14
          • 2021-05-29
          • 2012-04-10
          • 2013-02-28
          • 2019-10-19
          • 1970-01-01
          相关资源
          最近更新 更多