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

时间:2011-08-27 23:22:19

标签: java arrays string

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

错误是说我无法在字符串中添加字符。类型不匹配。

6 个答案:

答案 0 :(得分:2)

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

以下代码反转String。

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

答案 1 :(得分:0)

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

我发现以下内容:

  1. for(char x:letters){
    这种形式的for循环将迭代letters中的每个字符。因此,x将设置为letters中的每个字符。但是,您尝试将其用作索引 - 这很好,因为char可以强制转换为int。但是,由于您从未初始化字符数组(letters),因此0的值始终为x。这意味着你总是设置letters的第一个元素,覆盖之前的元素。

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

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


  4. 以下是对您的代码的修复,它使用toCharArray()对象可用的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));
        }
    }
    

    这更好,因为

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

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

答案 2 :(得分:0)

你需要在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 :(得分:0)

您的示例中存在多个错误。我已修复代码并使其更好地工作。主要错误是,您已在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 :(得分:0)

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

答案 5 :(得分:0)

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

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

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