- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我收到不需要的输入时,我再次调用该方法,但在第二次迭代时,字符串上仍然留有一个字符。为什么它不创建一个全新的字符串并替换旧的值?
首先我在扫描仪中输入“mmmm”,这会触发 if 语句中的条件并调用 createSocial()
,然后重新运行循环,然后我输入一个新输入5555。现在这是我没有得到的:当我打印出新的字符串时,它们显示为 5555,但是然后在循环中打印它们时留下了“m”,为什么?
public class test {
public static String createSocial() {
Scanner sc = new Scanner(System.in);
String social = sc.nextLine();
String digit = social;
System.out.println(social + " SOCIAL");
System.out.println(digit + " DIGIT");
if (social.length() != 4) {
System.out.println("You did not type 4 digits, try again");
createSocial();
}
//check non-integers
while(digit.length() > 0) {
System.out.println( digit.charAt(0) + "<---");
if(Character.isDigit( digit.charAt(0) ) == false) {
System.out.println("You did not type your last 4 digits correctly, try again");
createSocial();
}
digit = digit.substring(1);
}
return social;
}
}
这是我的输出:
enter the last 4 digits of your Social Security number
mmmm //(This is my first input for the scanner)
mmmm SOCIAL
mmmm DIGIT
m<---
You did not type your last 4 digits correctly, try again
5555 //(this is my input for the scanner the second time around)
5555 SOCIAL
5555 DIGIT
5<---
5<---
5<---
5<---
m<---
You did not type your last 4 digits correctly, try again
最佳答案
您看到 m 的原因如下:
5<---
5<---
5<---
5<---
m<---
只是因为您在开始递归调用之前没有清除 social 字符串变量。实际上,当进行此递归调用时,您应该这样做:
social = createSocial();
这样可以保证 social 始终保留该递归调用的真实值,而不是之前递归调用的值。如果您不从 createSocial() 方法获取返回值,您将永远不会获得新结果,因为 social 变量的范围对于方法本身而言是本地的。您需要接受返回值,就像第一次初始调用 createSocial() 方法时一样。
但这还不是全部,您还需要在每次递归调用( digit = social;
)后更新 digit 变量内容。在我看来,这比必要的更复杂。我理解为什么您添加了 digit 变量,但是如果您仔细查看代码,您可以通过继续利用 social 变量来完成同样的事情进行数值分解。您只需将原始值保存在 social 中,然后在方法返回的变量中进行数值分割,例如:
private static int methodCalls = 0; // Class Global Member Variable
public static String createSocial() {
methodCalls++;
Scanner sc = new Scanner(System.in);
String social = sc.nextLine();
System.out.println(social + " SOCIAL");
if (social.length() != 4) {
System.out.println("You did not type 4 digits, try again");
social = createSocial();
}
// returnResult will eventually will hold the
// valid result to return.
String returnResult = social;
//check non-integers
while (social.length() > 0) {
System.out.println(social.charAt(0) + " <--- Method call: " + methodCalls);
if (Character.isDigit(social.charAt(0)) == false) {
System.out.println("You did not type your last 4 digits correctly, try again");
social = createSocial();
}
social = social.substring(1);
}
methodCalls--;
return returnResult;
}
使用您发布的示例参数(mmmmm 和 5555),您可以使用上面的代码,如下所示:
System.out.println(createSocial());
输入mmmmm和5555后,控制台的输出结果将如下所示:
mmmmm
mmmmm SOCIAL
You did not type 4 digits, try again
5555
5555 SOCIAL
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 1
5 <--- Method call: 1
5 <--- Method call: 1
5 <--- Method call: 1
5555
为什么都是5 <---
?因为单次递归调用。标记为 Method call: 1 的 5 是对 createSocial() 方法的初始调用。任何超过 1 的方法调用都是递归调用。每次调用四个5 <---
已列出。
这一切都可以以更简单的方式完成,并且不需要递归来执行此任务,可以使用循环来代替,例如:
public static String createSocial() {
String ls = System.lineSeparator();
Scanner sc = new Scanner(System.in);
String social = "";
while (social.equals("")) {
System.out.print("Please enter the last four digits of " + ls
+ "your Social Security Number: --> ");
social = sc.nextLine();
if (!social.matches("\\d{4}")) {
System.err.println("Invalid Entry! Please Try Again..." + ls);
social = "";
}
}
return social;
}
但是如果需要递归,那么你可以这样做:
public static String createSocial() {
String ls = System.lineSeparator();
Scanner sc = new Scanner(System.in);
String social = "";
System.out.print("Please enter the last four digits of " + ls
+ "your Social Security Number: --> ");
social = sc.nextLine();
if (!social.matches("\\d{4}")) {
System.err.println("Invalid Entry! Please Try Again..." + ls);
social = createSocial();
}
return social;
}
使用 Java 的 String#matches()方法连同一个小Regular Expression检查数据输入有效性消除了对大量代码的需要,并使内容更容易阅读。上述两个代码示例中 IF 语句条件的 matches() 方法中使用的正则表达式 (RegEx)
if (!social.matches("\\d{4}")) {
基本上意味着:如果用户输入字符串不是四位整数值,则显示“无效输入!”消息。
关于java - 调用自己的方法时,旧字符串值会留下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58090491/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!