如何忽略Java中的空格

时间:2017-11-11 22:36:20

标签: java whitespace

我想知道如何忽略Java中的空格。此程序允许您输入您的第一个,中间和姓氏,然后输出您的姓名首字母。我现在试图让它忽略任何空格。提前谢谢!

    String fullName;
    char firstName;
    char secondName;
    char surname;
    int space1;
    int space2;

    System.out.println("Please enter your first name, your second name and your surname: ");
    fullName = kybd.nextLine();

    firstName = fullName.charAt(0);
    space1 = fullName.indexOf(" ");
    secondName = fullName.charAt(space1 + 1);
    space2 = fullName.lastIndexOf(" ");
    surname = fullName.charAt(space2 + 1);

    System.out.println("Initials: " + firstName + secondName + surname);
}

}

2 个答案:

答案 0 :(得分:1)

说明

您可以通过从输入文本中删除它们来隐式忽略它们。

因此,用""(空文本)替换所有出现次数:

fullName = fullName.replaceAll(" ", "");

此致电话fullName将不再包含空白

然而,当您分割空格时,您的逻辑会出现问题。

解决方案

替代方法可以是首先trim文字(删除前导尾随 空格)。然后执行拆分,然后删除所有其他空格

fullName = kybd.nextLine();
// Remove leading and trailing whitespaces
fullName = fullName.trim();

// Bounds
firstSpace = fullName.indexOf(" ");
lastSpace = fullName.lastIndexOf(" ");

// Extract names
String fullFirstName = fullName.substring(0, firstSpace);
String fullSecondName = fullName.substring(firstSpace + 1, lastSpace);
String fullSurname = fullName.substring(lastSpace + 1);

// Trim everything
fullFirstName = fullFirstName.trim(); // Not needed
fullSecondName = fullSecondName.trim();
fullSurname = fullSurname.trim();

// Get initials
firstName = fullFirstName.charAt(0);
secondName = fullSecondName.charAt(0);
surname = fullSurname.charAt(0);

实施例

我们来看一个示例输入(_代表空白):

__John___Richard_Doe_____

我们将首先trim fullName,然后获得:

John___Richard_Doe

现在我们确定第一个最后 空白并拆分它们:

First name:  John
Second name: ___Richard
Surname:     _Doe

最后我们还修剪所有内容并得到:

First name:  John
Second name: Richard
Surname:     Doe

使用charAt(0)我们可以访问缩写:

First name:  J
Second name: R
Surname:     D

更有活力

另一种更动态的方法是将所有连续的空格合并到单个空白中。因此,您需要从左到右遍历文本并在看到空格后开始录制,如果访问非空白字符则结束录制,然后替换该部分一个空格。

我们的例子是:

_John_Richard_Doe_

在额外trim之后,您可以再次使用常规方法:

John_Richard_Doe

或者您可以使用split(" "),然后拒绝为空 String

Iterator<String> elements = Pattern.compile(" ").splitAsStream(fullName)
    .filter(e -> !e.isEmpty())     // Reject empty elements
    .collect(Collectors.toList())  // Collect to list
    .iterator()                    // Iterator

firstName = elements.next().charAt(0);
secondName = elements.next().charAt(0);
surname = elements.next().charAt(0);

再次使用该示例,Stream首先包含

"", "", "John", "", "", "Richard", "Doe", "", "", "", "", ""

过滤后

"John", "Richard", "Doe"

减号

正如你所说,你也想要

Richard Jack Smith-Adams

输出RJS-A,您可以在分割空白之后在-上拆分。

Pattern spacePatt = Pattern.compile(" ");
Pattern minusPatt = Pattern.compile("-");
String result = spacePatt.splitAsStream(fullName)  // Split on " "
    .filter(e -> !e.isEmpty())                     // Reject empty elements
    .map(minusPatt::splitAsStream)                 // Split on "-"
    .map(stream ->
        stream.map(e -> e.substring(0, 1)))        // Get initials
    .map(stream ->
        stream.collect(Collectors.joining("-")))   // Add "-"
    .collect(Collectors.joining(""));              // Concatenate

哪个输出RJS-A

这种方法有点复杂,因为我们需要维护子流的信息,我们不能只将flatMap所有内容放在一起,否则我们不知道在哪里添加{{1}再次。所以在中间部分我们确实在-个对象上运行。

答案 1 :(得分:0)

我认为你在此之后的是split method in String

您可以这样使用:

4

您可能需要的另一件事是trim method,它会从字符串的正面和背面删除空格。

String fullName = "John Alexander Macdonald";
String[] split = fullName.split(" "); // ["John", "Alexander", "Macdonald"]