簡體   English   中英

為什么在嘗試在Java中反轉字符串時會出現類型不匹配的問題?

[英]Why do I get a type mismatch when trying to reverse a string in 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];
        }
    }
}

錯誤是說我無法在字符串中添加字符。 類型不匹配。

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

這更好,因為

一種。 String是不可變的,這意味着一旦創建它們就不能被修改(除非你求助於使用反射),並且每次附加到字符串時,實際上你創建了一個在這種情況下浪費的新對象。 StringBuilderStringBuffer用於您想要更改字符序列的情況。

由於可以逐個字符地訪問String ,因此實際上不需要創建字符串的字符數組表示來反轉它。

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

}

}

否則每次循環運行時都會重新創建並丟棄它

我修復了一些其他錯誤

您的示例中存在多個錯誤。 我已修復代碼並使其更好地工作。 主要錯誤是,您已在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());
    }
}

這有點令人困惑,但兩個for loops都有兩個錯誤。

在第一個中,您使用x作為索引。 x為你定義的char x是一個char ,而不是int (好吧,也許你可能想看看原語轉換,因為這可能會非常棘手)。 在每次迭代的第一個循環中, x將被更新並包含letters[]的“next”字符。

在第一次迭代的第二個循環中,將出現一個`IndexOutOfBoundException'。 數組的最后一個元素等於它的長度為1,因為數組0基於!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM