两个问题,将 charAt 用于未定义的输入和循环输出
Two problems, using charAt for undefined input and looping output
所以,我昨天 post 编辑了这段几乎相同的代码,询问如何在使用 .split
后将标点符号留在反句末尾。我还在苦苦挣扎,但同样的代码也有另一个问题:这是我的屏幕截图 http://i.stack.imgur.com/peiEA.png
import java.util.Scanner;
import java.util.StringTokenizer; // for splitting
public class MyTokenTester
{
public static void main(String\[\] args)
{
Scanner enter = new Scanner(System.in);
String sentinel = ""; // condition for do...while
String backward = ""; // empty string
char lastChar = '[=10=]';
do
{
System.out.println("Please enter a sentence: ");
String sentence = enter.nextLine();
String\[\] words = sentence.split(" "); // array words gets tokens
// System.out.printf("The string is%s",sentence.substring(sentence.length()));
for (int count = words.length -1; count>=0; count--) // reverse the order and assign backward each token
{
backward += words\[count\] + " ";
}
System.out.println(backward); // print original sentence in reverse order
System.out.println("Hit any key to continue or type 'quit' to stop now: ");
sentinel = enter.nextLine();
sentinel = sentinel.toLowerCase(); // regardless of case
} while (!sentinel.equals("quit")); // while the sentinel value does not equal quit, continue loop
System.out.println("Programmed by ----");
} // end main
} // end class MyTokenTester][1]][1]
你们大概可以从我的屏幕截图中看到,当提示用户添加另一个句子时,前面的句子被再次读回。
我的问题是:
- 如何使用
charAt
识别未定义索引处的字符(用户输入的长度不同)
- 如何在用户决定继续阅读后阻止我的句子回读。
再一次,正如我所说,我昨天 post 编辑了这段代码,但是线程死了,我遇到了原始 post 中没有提到的其他问题。
为了解决第 2 部分,如果您想停止句子读回先前的输入,请将 backward
重置为空字符串,因为就目前而言,您会不断向多变的。因此,要解决此问题,请在 do-while
循环结束之前添加这行代码,
backward = "";
针对第 1 部分,如果您想检查字符串中的最后一个字符,那么首先您必须知道该字符串的最后一个索引是什么。好吧,一个字符串的索引从 0
到 str.length()-1
。因此,如果您想访问用户输入中的最后一个字符,只需通过执行以下操作访问 words
数组(索引从 0
到 words.length - 1
)中的最后一个单词,
words[count].charAt(words[count].length() - 1);
请注意,count
就是 words.length - 1
,因此可以根据您的喜好进行更改。
1) 所以你有这个字符串数组 words
。在将每个单词添加到 backward
字符串之前,您可以使用类似:words[count].chartAt(words[count].length() - 1)
的内容。它会 return 你这个词最后位置的字符。现在您可以检查它是字母还是任何特殊字符了。
2) 问题不在于它再次读取上一行,问题在于 backward
字符串仍然具有之前的结果。当您使用 +
运算符设置字符串的值时,它会继续将它与之前的结果相加。你应该在处理其他输入之前清理它以获得你想要的结果。
这是您的代码:
import java.util.*;
public class main{
public static void main(String[] args){
Scanner enter = new Scanner(System.in);
String sentinel = ""; // condition for do...while
String backward = ""; // empty string
char lastChar = '[=10=]';
do
{
System.out.println("Please enter a sentence: ");
String sentence = enter.nextLine();
String[] words = sentence.split(" "); // array words gets tokens
// System.out.printf("The string is%s",sentence.substring(sentence.length()));
List<String> items = Arrays.asList(words);
Collections.reverse(items);
System.out.println(generateBackWardResult(items)); // print original sentence in reverse order
System.out.println("Hit any key to continue or type 'quit' to stop now: ");
sentinel = enter.nextLine();
// i use quals ignore case, makes the code more readable
} while (!sentinel.equalsIgnoreCase("quit")); // while the sentinel value does not equal quit, continue loop
System.out.println("Programmed by ----");
} // end main
static String generateBackWardResult(List<String> input){
String result="";
for (String word:input){
result =result +" "+word;
}
return result;
}
} // end class MyTokenTester][1]][1]
还有一些事情要提一下:
* 永远不要再发明轮子! (要还原数组,java 实用程序包中有很多方法,请使用它们。)
*写干净的代码,做每一个功能,我一个单独的方法。在您的情况下,您正在使用一种方法进行恢复和显示结果。
所以,我昨天 post 编辑了这段几乎相同的代码,询问如何在使用 .split
后将标点符号留在反句末尾。我还在苦苦挣扎,但同样的代码也有另一个问题:这是我的屏幕截图 http://i.stack.imgur.com/peiEA.png
import java.util.Scanner;
import java.util.StringTokenizer; // for splitting
public class MyTokenTester
{
public static void main(String\[\] args)
{
Scanner enter = new Scanner(System.in);
String sentinel = ""; // condition for do...while
String backward = ""; // empty string
char lastChar = '[=10=]';
do
{
System.out.println("Please enter a sentence: ");
String sentence = enter.nextLine();
String\[\] words = sentence.split(" "); // array words gets tokens
// System.out.printf("The string is%s",sentence.substring(sentence.length()));
for (int count = words.length -1; count>=0; count--) // reverse the order and assign backward each token
{
backward += words\[count\] + " ";
}
System.out.println(backward); // print original sentence in reverse order
System.out.println("Hit any key to continue or type 'quit' to stop now: ");
sentinel = enter.nextLine();
sentinel = sentinel.toLowerCase(); // regardless of case
} while (!sentinel.equals("quit")); // while the sentinel value does not equal quit, continue loop
System.out.println("Programmed by ----");
} // end main
} // end class MyTokenTester][1]][1]
你们大概可以从我的屏幕截图中看到,当提示用户添加另一个句子时,前面的句子被再次读回。
我的问题是:
- 如何使用
charAt
识别未定义索引处的字符(用户输入的长度不同) - 如何在用户决定继续阅读后阻止我的句子回读。
再一次,正如我所说,我昨天 post 编辑了这段代码,但是线程死了,我遇到了原始 post 中没有提到的其他问题。
为了解决第 2 部分,如果您想停止句子读回先前的输入,请将 backward
重置为空字符串,因为就目前而言,您会不断向多变的。因此,要解决此问题,请在 do-while
循环结束之前添加这行代码,
backward = "";
针对第 1 部分,如果您想检查字符串中的最后一个字符,那么首先您必须知道该字符串的最后一个索引是什么。好吧,一个字符串的索引从 0
到 str.length()-1
。因此,如果您想访问用户输入中的最后一个字符,只需通过执行以下操作访问 words
数组(索引从 0
到 words.length - 1
)中的最后一个单词,
words[count].charAt(words[count].length() - 1);
请注意,count
就是 words.length - 1
,因此可以根据您的喜好进行更改。
1) 所以你有这个字符串数组 words
。在将每个单词添加到 backward
字符串之前,您可以使用类似:words[count].chartAt(words[count].length() - 1)
的内容。它会 return 你这个词最后位置的字符。现在您可以检查它是字母还是任何特殊字符了。
2) 问题不在于它再次读取上一行,问题在于 backward
字符串仍然具有之前的结果。当您使用 +
运算符设置字符串的值时,它会继续将它与之前的结果相加。你应该在处理其他输入之前清理它以获得你想要的结果。
这是您的代码:
import java.util.*;
public class main{
public static void main(String[] args){
Scanner enter = new Scanner(System.in);
String sentinel = ""; // condition for do...while
String backward = ""; // empty string
char lastChar = '[=10=]';
do
{
System.out.println("Please enter a sentence: ");
String sentence = enter.nextLine();
String[] words = sentence.split(" "); // array words gets tokens
// System.out.printf("The string is%s",sentence.substring(sentence.length()));
List<String> items = Arrays.asList(words);
Collections.reverse(items);
System.out.println(generateBackWardResult(items)); // print original sentence in reverse order
System.out.println("Hit any key to continue or type 'quit' to stop now: ");
sentinel = enter.nextLine();
// i use quals ignore case, makes the code more readable
} while (!sentinel.equalsIgnoreCase("quit")); // while the sentinel value does not equal quit, continue loop
System.out.println("Programmed by ----");
} // end main
static String generateBackWardResult(List<String> input){
String result="";
for (String word:input){
result =result +" "+word;
}
return result;
}
} // end class MyTokenTester][1]][1]
还有一些事情要提一下: * 永远不要再发明轮子! (要还原数组,java 实用程序包中有很多方法,请使用它们。) *写干净的代码,做每一个功能,我一个单独的方法。在您的情况下,您正在使用一种方法进行恢复和显示结果。