所以,我一直是新手程序员,但最近决定学习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();
以下代码反转String。
StringBuilder sb = new StringBuilder(thing);
sb = sb.reverse();
String retval = sb.toString();
答案 1 :(得分:0)
你没有告诉我们错误是什么。
我发现以下内容:
for(char x:letters){
这种形式的for
循环将迭代letters
中的每个字符。因此,x
将设置为letters
中的每个字符。但是,您尝试将其用作索引 - 这很好,因为char
可以强制转换为int
。但是,由于您从未初始化字符数组(letters
),因此0
的值始终为x
。这意味着你总是设置letters
的第一个元素,覆盖之前的元素。
for(int i=thing.length()...
。
由于数组是0索引的,length
总是比最后一个元素的索引多一个。因此,通过访问具有数组长度的数组,您将超出1.您应该将i
初始化为thing.length()-1
。
String retval += letters[i];
这无法编译 - 您无法声明和追加。 retval
应在for循环之外声明。
以下是对您的代码的修复,它使用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
是不可变的,这意味着一旦创建它们就不能被修改(除非你求助于使用反射),并且每次附加到字符串时,实际上你创建的新对象在这种情况下是浪费的。 StringBuilder
或StringBuffer
适用于您想要对字符序列进行更改的情况。
湾由于可以逐个字符地访问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 x
是char
而不是int
(好吧,也许您可能想要查看基元转换,因为这可能很棘手)。在每次迭代的第一个循环中,x
将更新并包含letters[]
中的“下一个”字符。
在第一次迭代的第二个循环中会出现一个`IndexOutOfBoundException'。数组的最后一个元素等于它的长度为1,因为数组0基于!