2011-08-27 34 views
0

所以,我一直是新手程序员,但最近决定学习Java。我只是在用一个小的构造函数来调用一个字符串,然后将其写回(我的做法绝不是高效的,我只是简单地使用不同的工具,以便习惯)当我试图在数组中添加字符到字符串时,出现了错误。这是代码:为什么在尝试颠倒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]; 
     } 
    } 
} 

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

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

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

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

+1用于逐行指出问题 – eon

0

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

我发现以下内容:

  1. for(char x:letters){
    for环的这种形式将在letters遍历每个字符。因此,x将被设置为letters中的每个字符。但是,您试图将其作为索引使用 - 这种情况可以,因为char可以投射到int。但是,由于您从不初始化字符数组(letters),所以对于x,您总能得到0的值。这意味着你总是设置letters的第一个元素,覆盖之前的元素。

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

  3. String retval += letters[i];
    这编译失败 - 你不能声明追加。应该在for循环之外声明retval


这里有一个修复你的代码,使用现有的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)); 
    } 
} 

这是因为

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

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

+0

对不起,我在第二个到最后一句中试图避开它,但不清楚。错误是说我不能将字符添加到字符串中。类型不匹配。 – Sam

+0

@Sam请看我更新的答案 - 你不能在同一个语句中声明和追加,你应该在循环之外声明'retval'。此外,您的代码还存在其他问题,导致其无法按预期工作。 –

0

你需要外部的声明RETVAL for循环:

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]; 

} 

} 

否则就重新和循环运行

有我固定

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

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

其绝对称为StringBuilder – Woot4Moo

+0

呃?什么叫做StringBuilder? – eon

+0

当Java API提供了一种用于反转可以转换为字符串的Object的方法时,您建议使用Apache commons。 – Woot4Moo

0

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

在第一次使用x作为索引。你用char x定义的xchar而不是int(嗯,也许你可能想看看原始转换,因为这可能会很棘手)。在每个迭代的第一个循环中,x将被更新并且包含letters[]中的'next'字符。

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

相关问题