为什么在Java中尝试反转字符串时会出现类型不匹配?
所以,我一直是一个新手程序员,但最近决定学习Java。我只是在摆弄一个小构造器,这个构造器接收一个字符串,然后将其向后写入(我这样做的方法根本不被认为是有效的,我只是在使用我可以使用的不同工具以适应它。)我的错误是在试图将数组中的字符添加到字符串时出现的。代码如下:为什么在Java中尝试反转字符串时会出现类型不匹配?,java,arrays,string,Java,Arrays,String,所以,我一直是一个新手程序员,但最近决定学习Java。我只是在摆弄一个小构造器,这个构造器接收一个字符串,然后将其向后写入(我这样做的方法根本不被认为是有效的,我只是在使用我可以使用的不同工具以适应它。)我的错误是在试图将数组中的字符添加到字符串时出现的。代码如下: public class dids { char letters[]; public dids(String thing) { letters= new char[thing.length
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];
}
}
}
错误是无法将字符添加到字符串中。类型不匹配。您没有告诉我们错误是什么 我指出以下几点:
用于(字符x:字母){
这种形式的
for
循环将迭代字母中的每个字符。因此,x
将被设置为字母中的每个字符。但是,您试图将其用作索引-这是可以的,因为char
可以转换为int
。但是,由于您从未初始化数组o对于字符(letters
),对于x
,您总是会得到一个值0
。这意味着您总是设置letters
的第一个元素,覆盖上一个元素
for(int i=thing.length()…
由于数组是0索引的,
length
总是比最后一个元素的索引多一个。因此,通过使用数组的长度访问数组,您超出了1的界限。您应该将i
初始化为thing.length()-1
String retval+=字母[i];
编译失败-无法声明和追加。
retval
应在for循环之外声明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);
}
下面是对代码的修复,它使用了
tocharray()
方法,可用于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是不可变的,这意味着一旦创建它们就不能修改(除非您使用反射)每次附加到字符串时,实际上是在创建一个新对象,在这种情况下这是一种浪费。StringBuilder
或StringBuffer
用于更改字符序列的情况
b、 由于可以逐个字符访问
字符串,因此实际上不需要创建字符串的字符数组表示来反转字符串。您需要在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];
}
}
公共DID(字符串)
{
字母=新字符[thing.length()];
对于(int x=0;x=0;i--){//按1固定
retval+=字母[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());
}
}
您希望使用String.tocharray填充数组,如下所示:
letters=thing.toCharArray();
下面的代码将字符串反转
StringBuilder sb = new StringBuilder(thing);
sb = sb.reverse();
String retval = sb.toString();
这有点令人困惑,但是循环的和中都有两个错误
在第一种情况下,您使用x
作为索引。x
是char
而不是int
(好吧,您可能想看看原语转换,因为这可能很棘手)。在每次迭代的第一个循环中,x
将被更新,并在字母[]
中包含“下一个”字符
在第一次迭代的第二个循环中,将出现“IndexOutOfBoundException”。数组的最后一个元素等于它的长度-1,因为数组基于0!对不起,我在倒数第二句中试图避开它,但不清楚。错误是我无法向字符串添加字符。类型不匹配。@Sam请查看我的u更新的答案-您不能在同一语句中声明和追加,您应该在循环外声明retval
。此外,代码中还有其他问题会导致它无法按预期工作。它肯定称为StringBuilderReh?什么叫StringBuilder?您建议在Java API提供可以将对象转换为字符串的反转方法。啊,谢谢,我在commons StringUtilsI中考虑了反转方法。我将您的问题标题编辑为更具描述性的内容…请随意再次编辑。此外,我还尝试包含“错误消息”从您的注释中-但是您应该简单地复制问题中编译器的实际错误消息。(编译器肯定不会输出,我不能向字符串添加字符
)