【问题标题】:How to add spaces to left and right of chars in a string?如何在字符串中的字符左右添加空格?
【发布时间】:2021-03-25 20:05:27
【问题描述】:

我正在尝试在字符串中的每个字符的两侧打印一个带有空格的字符串

如果我有

String s = "abcde"

它会创建这样的东西

 a   b   c   d   e 

第一个字符前有一个空格,每个字符之间有三个。

根据我的知识,我只是无法找到一种方法。

【问题讨论】:

  • 可能考虑String.charAt() 和输入字符串长度的循环。请注意,如果输入可以包含表情符号等,则需要更高级的方法。

标签: java string char


【解决方案1】:

更新

更新要求:

我没有意识到我需要在前面添加一个位置的东西 第一个术语,然后每个术语之间有 3 个空格。 以_0___0___0___0___0_ 为例。

对于更新后的需求,你可以使用另一个很酷的东西,String#join

public class Main {
    public static void main(String[] args) {
        String s = "abcde";

        String result = "_" + String.join("___", s.split("")) + "_";

        System.out.println(result);
    }
}

输出:

_a___b___c___d___e_

原答案

有很多方法可以做到这一点。我发现使用正则表达式更容易:

public class Main {
    public static void main(String[] args) {
        String s = "abcde";
        String result = s.replaceAll(".", " $0 ");
        System.out.println(result);
    }
}

输出:

 a  b  c  d  e 

正则表达式,. 匹配单个字符,$0 用空格 + 匹配 + 空格替换此匹配。

另一种很酷的方法是使用 Stream API。

import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String s = "abcde";
        
        String result = Arrays.stream(s.split(""))
                                .map(str -> " " + str + " ")
                                .collect(Collectors.joining());
        
        System.out.println(result);
    }
}

输出:

 a  b  c  d  e 

【讨论】:

  • 我从未使用过 Stream 看起来很有趣。但是,我没有意识到我需要在第一个术语前添加一个位置,然后在每个术语之间添加 3 个空格的东西。以_0___0___0___0___0_ 为例。
  • @Anthony - 我已经发布了此要求的更新。
【解决方案2】:

一个超级简单的例子,它不能处理大量潜在的输入场景。

    public static void main(String[] args)
    {
        String s = "abcde";
        
        
        for (int i = 0; i < s.length(); ++i) {
            System.out.print("_" + s.charAt(i));
        }
        System.out.println("_");
    }

注意:使用下划线而不是空格,以便直观地检查输出。

示例输出:

_a_b_c_d_e_

例如,可以将StringBuilder.append 用于构建器,而不是直接输出。

使用 StringBuilder:

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); ++i) {
            sb.append('_').append(s.charAt(i));
        }
        sb.append('_');        
        
        System.out.println(sb.toString());

基于所需输出略有不同的评论(两个内部空格,一个前导和尾随空格),这提出了一种替代方法:

   public static String addSpace(String inp) {
        StringBuilder sB = new StringBuilder();
        
        String string = inp.trim();
        
        String div = "___";  // spaces, or whatever
        
        
        sB.append('_');  // add leading space
        for(int index = 0; index < string.length(); ++index) {
            sB.append(string.charAt(index))
                .append(div);  // two spaces  
         }
        sB.setLength(sB.length() - (div.length() - 1) );
        
        return (sB.toString());
    }

注意:再次使用下划线以便于调试。

div 设置为 3 个下划线(或空格)时的输出:

_0___0___0___1___0___1___1___0_

【讨论】:

  • 我将尝试使用 StringBuilder,因为我需要将其输入回变量中以供以后使用,我以前从未使用过它。谢谢!
  • 这好像是在前面加了两个空格,但是我需要左右一个空格。
  • @Anthony,怎么会这样?它在每个字母前添加一个空格,然后在字符串末尾添加一个空格。示例输出未指示两个空格。你看到了什么让你相信你看到了两个领先的空间?
  • 当我将它写入我的代码时,它就是这样做的。
  • "?ab?""_?_?_a_b_?_?_"
【解决方案3】:

你可以定义一个空字符串:result = “”;

然后用foreach循环遍历你要打印的字符串用函数toCharArray()

(char 字符:str.toCharArray())

在这个循环里面做 ->

结果+=“”+字符;

【讨论】:

    【解决方案4】:
    String result = s.chars().mapToObj(
                           Character::toString
                       ).collect(Collectors.joining(" "));
    

    类似于循环版本,但使用 Stream。

    【讨论】:

    • 使用流的方式简单直接 :)。万一有人在将 String 转换为 int 时遇到问题,您可以使用 mapToObj() 代替 map()
    【解决方案5】:

    另一种实现这一点的方法是,将字符串拆分为字符串 [] 字符并用空格连接它们:

    public class Main {
        public static void main(String[] args) {
            String s = "abcde";
            System.out.println(" " + String.join("  ", s.split("")) + " ");
        }
    }
    

    输出: a b c d e

    编辑: 上面的代码不适用于像“?ab?”这样的带有 Unicode 代码点的字符串,所以不要在空字符串上拆分,而是应该在正则表达式上执行拆分:"(?&lt;=.)"

    public class Main {
        public static void main(String[] args) {
            String s = "abcde";
            System.out.println(" " + String.join("  ", s.split("(?<=.)")) + " ");
        }
    }
    

    感谢@saka1029 指出这一点。

    【讨论】:

    • "?ab?"" ? ? a b ? ? "。您应该使用正则表达式 "(?&lt;=.)" 而不是 ""
    【解决方案6】:

    您可以使用带有三个参数的Collectors.joining(delimiter,prefix,suffix) 方法:

    String s1 = "abcde";
    
    String s2 = Arrays.stream(s1.split(""))
            .collect(Collectors.joining("_+_", "-{", "}-"));
    
    System.out.println(s2); // -{a_+_b_+_c_+_d_+_e}-
    

    另见:How to get all possible combinations from two arrays?

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2022-06-13
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多