扫描器对象中返回字符串的数字的倒序(java)
我有一个重大的任务,我真的不知道如何去做。任务如下: 在Java公共静态字符串reverse(Scanner scan)中编写一个递归方法,Scanner对象包含数字,这些数字应该以字符串的相反顺序返回。这里有一个棘手的部分,你不允许使用数组、列表或字符串——假设只声明一个变量 反向输入(例如,新扫描仪(“20 33 40”)应返回: “40 33 20”扫描器对象中返回字符串的数字的倒序(java),java,recursion,java.util.scanner,reverse,Java,Recursion,Java.util.scanner,Reverse,我有一个重大的任务,我真的不知道如何去做。任务如下: 在Java公共静态字符串reverse(Scanner scan)中编写一个递归方法,Scanner对象包含数字,这些数字应该以字符串的相反顺序返回。这里有一个棘手的部分,你不允许使用数组、列表或字符串——假设只声明一个变量 反向输入(例如,新扫描仪(“20 33 40”)应返回: “40 33 20” 如果不是因为限制,我会知道如何去做。我真的不知道我该如何解决这个问题。我对编程非常陌生,我知道你们中的一些人反对帮助完成作业,我非常感谢你们
如果不是因为限制,我会知道如何去做。我真的不知道我该如何解决这个问题。我对编程非常陌生,我知道你们中的一些人反对帮助完成作业,我非常感谢你们的指点。第一种可能使用String 您可以直接使用
字符串
作为数据结构。在读取新数字时,在开头而不是结尾添加
基本上使用如下代码:
String str = "";
while (yourcondition) {
str = scanner.nextInt() + " " + str;
}
return str;
第二种可能使用StringBuffer或StringBuilder
StringBuilder str = new StringBuilder();
while (yourcondition) {
str.insert(0, " ").insert(0, scanner.nextInt());
}
return str.toString();
第三种可能使用递归:
public String read(String str, Scanner scanner) {
if (testExitCondition) {
return str;
}
return scanner.nextInt() + " " + str;
}
// Called with System.out.println(read("", scanner));
注意
第一种解决方案使用String创建了许多String实例,但只有一个对它的引用
第二种解决方案使用现有的类,这些类在内部使用数组对字符串进行操作
第三种方法是将对已创建字符串的引用留给JVM,因此代码中不存在对该字符串的显式引用。这是唯一一种没有显式变量声明的方法(仅在方法的签名中,而不是在外部)。在您的限制下,您会得到结果,然后以相反的顺序输出字符串
public static void main(String[] args) {
Scanner scanner = new Scanner("20 33 40");
System.err.println(scan(scanner));
}
public static String scan(Scanner scanner) {
if (scanner.hasNext()) {
String next = scanner.next();
String result = scan(scanner);
return result.isEmpty() ? next : result + " " + next;
}
return "";
}
编写递归方法是每个编程学校的必修课。技巧总是一样的:
public static String reverse(Scanner scan) {
if (scan.hasNextInt()) { // check whether to continue or not
int number = scan.nextInt(); // split part
return reverse(scan) + " " + number; // assemble this part and the rest
} else {
return ""; // return an initial or base value (the neutral element)
}
}
调用递归之前必须先调用
scan.nextInt()
,否则下一个数字就不会被分割。您可以使用scanner.hasNext()
和while
循环。使用StringBuilder
收集预先准备好的数据
Scanner scanner = new Scanner("12 52 10");
StringBuilder builder = new StringBuilder();
while (scanner.hasNext()) {
builder.insert(0, scanner.next()).insert(0, " ");
}
builder.replace(0, 1, "");
System.out.println(builder.toString());
你只想要指针 您必须编写一个递归函数
stringreverse(Scanner-Scanner)
,该函数以相反的顺序返回数字。此任务的目的是让您了解grok递归,这可能类似于向后思考
在reverse()
函数的第一次运行中,您通过了一个扫描器,内容如下:
"20 33 40"
因此,从扫描仪中读取一个整数:
int value = scanner.readInt();
您的字段值
将包含整数20,扫描仪对象现在似乎只包含以下内容:
"33 40"
因此,假设您有一个反向函数,它将输出“4033”,那么您可以将值粘贴到它后面,得到“403320”
递归是假装你的函数已经做了它应该做的事情,并用更小版本的输入调用你自己,直到你得到一个普通版本。你的第一个调用是“20 33 40”,第二个调用是“33 40”,第三个调用是“40”,最后一个调用是“40”
您最后一次通过“”的呼叫很简单。您只需检查并返回“”
其他调用也没有那么难。您只需读取一个int,然后将它与递归调用的输出粘贴到一起,以reverse
我猜stringbuilder也不允许使用?请注意:这不是“我们中的一些人”反对在作业中提供帮助。重点是:这个网站有一些政策,可以提出好的问题;而作业帮助并不是一个好的类别……你不允许使用数组、列表或字符串。它也是“只假设声明一个变量。”
,但我认为如果您只需内联nextInt()
调用,StringBuilder
方法就可以工作。我删除了对int声明的引用。我认为该方法是返回值所必需的,而不是简单地打印出来。我修改它以提供返回值非常简单的解决方案…感谢您提供了清晰的说明!