两个问题,将 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]

你们大概可以从我的屏幕截图中看到,当提示用户添加另一个句子时,前面的句子被再次读回。

我的问题是:

  1. 如何使用 charAt 识别未定义索引处的字符(用户输入的长度不同)
  2. 如何在用户决定继续阅读后阻止我的句子回读。

再一次,正如我所说,我昨天 post 编辑了这段代码,但是线程死了,我遇到了原始 post 中没有提到的其他问题。

为了解决第 2 部分,如果您想停止句子读回先前的输入,请将 backward 重置为空字符串,因为就目前而言,您会不断向多变的。因此,要解决此问题,请在 do-while 循环结束之前添加这行代码,

backward = "";

针对第 1 部分,如果您想检查字符串中的最后一个字符,那么首先您必须知道该字符串的最后一个索引是什么。好吧,一个字符串的索引从 0str.length()-1。因此,如果您想访问用户输入中的最后一个字符,只需通过执行以下操作访问 words 数组(索引从 0words.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 实用程序包中有很多方法,请使用它们。) *写干净的代码,做每一个功能,我一个单独的方法。在您的情况下,您正在使用一种方法进行恢复和显示结果。