【问题标题】:How to convert a line of alphanumeric strings into 3 different parts如何将一行字母数字字符串转换为 3 个不同的部分
【发布时间】:2017-04-10 18:17:24
【问题描述】:

假设我从扫描仪得到以下输入:"5B1 2B2 9B3 1R4 3R5 8R6 10R7"

我希望将数据保存在类似这样的位置:

array[0]  = {5,B,1}
array[1]  = {2,B,2}

注意:我需要将字符左侧的数字保存为一个整体。
示例:我需要将10R7 保存为@987654324 @ 而不是{1,0,R,7}

使用这个:

String input = scanner.nextLine();
String[] nodes = input.split(" ");

我能够实现包含 {5B1,3B2} 等的数组。

编辑:

我尝试了这种方法(WORKS):

String[][] aa = new String[nodes.length][];
for(int i =0; i<nodes.length; i++ ){
   aa[i] = nodes[i].split("((?<=[a-zA-Z])(?=[0-9]))|((?<=[0-9])(?=[a-zA-Z]))");
}

如果您立即打印,就会出现这种情况:

   [Ljava.lang.String;@55f96302
   [Ljava.lang.String;@3d4eac69
   [Ljava.lang.String;@42a57993
   [Ljava.lang.String;@75b84c92
   [Ljava.lang.String;@6bc7c054
   [Ljava.lang.String;@232204a1
   [Ljava.lang.String;@4aa298b7

仅当我尝试使用以下方式打印时才会出现上述问题:

System.out.println(aa[i]);

还有另一种打印方式,但我不需要打印。

【问题讨论】:

  • char 一次只占用一个字符。
  • 你尝试了什么?
  • 使用split(" ") 加空格然后使用split("") 不加空格,你将得到你的char 数组

标签: java arrays string split


【解决方案1】:

您可以使用 split \\s 来获取您的单词,然后您可以使用 s.toCharArray() 来获取字符数组:

String str = "5B1 2B2 9B3 1R4 3R5 8R6 10R7";
List<String[]> list = new ArrayList<>();
String spl[] = str.split("\\s+");

for (String s : spl) {
   String sp[] = s.replaceAll("([a-zA-Z]+)", "$1-").replaceAll("([0-9]+)", "$1-").split("-");
   list.add(sp);
}

打印你的数组:

list.forEach((rs) -> {
    System.out.println(Arrays.toString(rs));
});

这可以给你:

[5, B, 1]
[2, B, 2]
[9, B, 3]
[1, R, 4]
[3, R, 5]
[8, R, 6]
[10, R, 7]

【讨论】:

  • \\s+ 呢?
  • 我怎样才能得到最后一个的 [10,R,7] 而不是 [1,0,R,7]?
  • 在这种情况下你必须使用另一种方式,如果你想要这种情况,你必须使用 String 而不是 char @MostafaOsama,我会用另一种方式
  • 是的,我的错,我确实会使用 String。你能告诉我怎么做吗?
【解决方案2】:
public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    String str = in.nextLine(); // Read 5B1 2B2 9B3 1R4 3R5 8R6 10R7 from user

    String[] sArr = str.split(" "); // break into array of string ["5B1", "2B2", .... "10R7"]

    char[][] cArr = new char[sArr.length][]; // create a 2D char array to save the string array
    int idx = 0;

    for(String s : sArr){
        cArr[idx++] = s.toCharArray(); // [['5','B','1'], ['2','B','2'], ...]
    }

    //Print the array
    for(char[] c1 : cArr){
        for(char c2: c1){
            System.out.print(c2 + " ");
        }
        System.out.println();
    }
}

【讨论】:

    【解决方案3】:

    好吧,在玩了一些之后,我找到了解决方法:

    对于在这里可能有类似情况的任何人:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
    String[] nodes = input.split(" ");
    
    String[][] aa = new String[nodes.length][];
    
    for (int i = 0; i < nodes.length; i++) {
        aa[i] = nodes[i].split("((?<=[a-zA-Z])(?=[0-9]))|((?<=[0-9])(?=[a-zA-Z]))");
    }
    

    【讨论】:

      【解决方案4】:

      只需拆分字符串

      String str = "5B1 2B2 9B3 1R4 3R5 8R6 10R7"
      String[] parts = str.split(" ");
      for (int i = 0; i < parts.length; i++) {
        System.out.println(parts[i]);
      }
      

      【讨论】:

      • 问题与 char[] 而非 String[] 有关。
      【解决方案5】:

      示例如下:

      public static void main(String args[]) {
          String s = "5B1 2B2 9B3 1R4 3R5 8R6 10R7";
      
          // split input string by spaces first
          // convert every chunk into char array
          List<char[]> result =
                  Arrays.asList(s.split(" ")).stream().map(String::toCharArray).collect(Collectors.toList());
      
          for (char[] r : result) {
              System.out.println(Arrays.toString(r));
          }
      }
      

      输出:

      [5, B, 1]
      [2, B, 2]
      [9, B, 3]
      [1, R, 4]
      [3, R, 5]
      [8, R, 6]
      [1, 0, R, 7]
      

      【讨论】:

      • 我可以让它输出为 {10,R,7} 吗?
      • @Lashane 我怎样才能做到这一点?
      • @MostafaOsama 在开头打印{,在结尾打印}
      • @Lashane 恐怕我听不懂你的解释
      • @MostafaOsama 你知道如何打印一个符号吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2021-03-17
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多