如何在Java中忽略白色[duplicate]

o7jaxewo  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(132)

此问题在此处已有答案

Remove all occurrences of char from string(13个答案)
五年前就关门了。
我想知道如何在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);
xtfmy6hx

xtfmy6hx1#

说明

您可以通过从输入文本中删除它们来隐式忽略它们。
因此,将所有匹配项替换为""(空文本):

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_____

我们将首先得到trimfullName,从而得到:

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所有的东西放在一起,否则我们不知道在哪里再添加-。所以在中间部分,我们实际上是在Stream<Stream<String>>对象上操作。

xzabzqsa

xzabzqsa2#

我想你在这里要找的是String中的split方法
您可以这样使用它:

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

另一个你可能需要的是trim方法,它删除字符串前后的空格。

String withSpaces = " a b c ";
String trimmed = withSpace.trim(); // "a b c"

相关问题