[英]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();
你沒有告訴我們錯誤是什么。
我發現以下內容:
for(char x:letters){
for
循環的這種形式將迭代letters
每個字符。 因此, x
將被設置為letters
每個字符。 但是,您正在嘗試將其用作索引 - 這很好,因為char
可以轉換為int
。 但是,由於您從不初始化字符數組( letters
),因此x
的值始終為0
。 這意味着你總是設置letters
的第一個元素,覆蓋前一個。
for(int i=thing.length()...
由於數組是0索引的,因此length
總是比最后一個元素的索引多一個。 因此,通過訪問具有數組長度的數組,您將超出1.您應該將i
初始化為thing.length()-1
。
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
是不可變的,這意味着一旦創建它們就不能被修改(除非你求助於使用反射),並且每次附加到字符串時,實際上你創建了一個在這種情況下浪費的新對象。 StringBuilder
或StringBuffer
用於您想要更改字符序列的情況。
灣 由於可以逐個字符地訪問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.