StringBuilder.insert()不会更改输出

时间:2018-10-30 20:36:34

标签: java

我正在尝试制作一个简短的程序,将任何字符串转换为T H I S F O N T。

例如:“这是一个测试句子”变成“ T H I S I S A T E S T S E N T N C E””

我在StringBuilder循环中有一个while,但是使用finale.insert(i, '\t');无效。

import java.util.Scanner;

public class Executable {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String x;
        int i = 0;

        System.out.print("Input text here: ");
        x = input.nextLine();

        StringBuilder finale = new StringBuilder(x.toUpperCase());

        while(i > finale.length()) {
            if(finale.substring(i, i) == " ") {
                i += 2;

                finale.insert(i, '\t');
            }
        }

        System.out.println(finale);

    }
}

有帮助吗?

6 个答案:

答案 0 :(得分:1)

您说的是while i>finale.length(),但是i被初始化为0。您永远不会进入while循环。

答案 1 :(得分:1)

您的代码有一些问题。在介绍可行的实现之前,让我们看一下其他问题。

  1. 您的while循环检查是否i > finale.length()。由于i = 0while循环再也没有机会开始。
  2. 您正在使用==比较字符串,这是不正确的。 ==用于确认两个对象是否相等,而不是两个字符串的值。您需要改用string.equals()
  3. 无论如何,您在循环中做得太多。使用简单的for循环可以很简单地完成目标。

这是您可以使用的新循环,而不是您拥有的循环:

for (int i = 1; i < finale.length(); i++) {
    finale.insert(i++, " ");
}

输出:T H I S F O N T


对于不熟悉for循环的用户,以下是上述内容的结构非常简单的细分。

for循环分为三个部分:

for (variable_to_increment; repeat_until_this_condition_is_met; modify_variable_on_each_iteration) {
    // Code to be executed during each pass of the loop
}
  • 首先,我们定义一个可以在每个循环上跟踪的变量:int i = 1。通过设置i = 1,我们将跳过字符串中的第一个字符。
  • 下一条语句i < finale.length()表示我们要继续重复此循环,直到达到字符串的长度为止。例如,如果字符串的长度为5个字符,并且我们已经运行了4次循环,则i现在等于5,并且不再小于字符串的长度,因此循环结束。
  • 最后一部分是i++。这告诉Java在每个循环之后我们要对i做什么。在这种情况下,我们希望每次循环重复时将值增加1。
  • 括号中的所有内容显然都是我们希望在每个循环中执行的代码。

答案 2 :(得分:1)

您的代码存在一些问题(请参见内联注释):

import java.util.Scanner;

public class Executable {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String x;
        int i = 0;

        System.out.print("Input text here: ");
        x = input.nextLine();

        StringBuilder finale = new StringBuilder(x.toUpperCase());

        while(i > finale.length()) { // this condition is incorrect. Initially
                                     // this condition will always be false
                                     // if you input some sentence. It should be 
                                     // i < finale.length()
            if(finale.substring(i, i) == " ") { // here preferably you should use
                                                // equals method to compare strings
                i += 2;
                // you are only incrementing the i if the ith
                // substring equals " ". Firstly, substring(i,i)
                // will return empty string because the second argument
                // is exclusive
                finale.insert(i, '\t');
            }
        }

        System.out.println(finale);

    }
}

如果您想使用其他方法(不是很理想)来完成您想做的事情,可以尝试以下方法:

import java.util.Scanner;

public class Executable {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String x;
        int i = 0;

        System.out.print("Input text here: ");
        x = input.nextLine();

        String finale = x.toUpperCase().replaceAll(" ","").replaceAll("", " ");



        System.out.println(finale);

    }
}

首先,将字符串转换为大写->然后删除单词之间的所有空格->然后在所有字母之间插入空格。这样做的代码行是

String finale = x.toUpperCase().replaceAll(" ","").replaceAll("", " ");

这是一个示例运行:

Input text here: This is a sentence
 T H I S I S A S E N T E N C E 

答案 3 :(得分:0)

  1. 您方法的正确方法是,只需递增,直到您的大小是初始String的两倍

    while (i < x.length() * 2) {
        finale.insert(i, '\t');
        i += 2;
    }
    
  2. 一个简单的方法是使用经典的for循环:

    StringBuilder finale = new StringBuilder();
    for (char c : x.toUpperCase().toCharArray()) {
        finale.append(c).append('\t');
    }
    

答案 4 :(得分:0)

使用for循环,因为您知道迭代次数:

    Scanner input = new Scanner(System.in);

    String x;

    System.out.print("Input text here: ");
    x = input.nextLine();

    StringBuilder finale = new StringBuilder(x.toUpperCase());

    int len = finale.length();
    for (int i = 1; i < 2 * len; i+=2 ) {
        finale.insert(i, '\t');
    }

    System.out.println(finale);

答案 5 :(得分:0)

您正在将字符串与==进行比较。绝对不要那样做;改用equals

对于将来的读者:可以使用Java 8 Streams优雅地完成此工作:

String result = str.chars()
    .filter(i -> i != ' ')
    .mapToObj(t -> (char) t)
    .map(Character::toUpperCase)
    .map(Character::valueOf)
    .collect(Collectors.joining(" ");