【问题标题】:Split and pair substrings by condition按条件拆分和配对子字符串
【发布时间】:2019-10-03 07:54:06
【问题描述】:

我有一个这样的字符串:"aa-bb,ccdd,eeff,gg-gg,cc-gg"。我需要用'-' 符号拆分字符串并从中创建两个字符串,但是如果原始字符串的逗号分隔部分不包含'-',则需要使用一些占位符而不是子字符串。如果是上面的示例输出应该是:

字符串 1:

"{aa,ccdd,eeff,gg,cc}"

字符串 2:

"{bb,0,0,gg,gg}"

我不能使用lastIndexOf() 方法,因为输入在一个字符串中。我不知道零件有多少。

if(rawIndication.contains("-")){
    String[] parts = rawIndication.split("-");
    String part1 = parts[0];
    String part2 = parts[1];
}

【问题讨论】:

  • 当您在结果中说“字符串”时,您的意思是“数组”吗?
  • @ggorlen : 没有输入和输出是字符串。
  • 好的,我在示例结果中添加了引号以澄清这一点。

标签: java string split substring


【解决方案1】:

这是一个使用流的 Java 8 解决方案。逻辑是首先用逗号分割输入字符串,生成一个术语数组。然后,对于每个术语,我们在 dash 上再次拆分,保留第一个条目。在没有破折号的术语的情况下,整个字符串将被保留。最后,我们连接回一个输出字符串。

String input = "aa-bb,ccdd,eeff,gg-gg,cc-gg";
int pos = 1;
String output = String.join(",", Arrays.stream(parts) 
    .map(e -> e.split("-").length >= (pos+1) ? e.split("-")[pos] : "0")
    .toArray(String[]::new));

System.out.println(output);

这个输出:

bb,0,0,gg,gg

【讨论】:

【解决方案2】:
    List<String> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();

    // First split the source String by comma to separate main parts
    String[] mainParts = sourceStr.split(",");

    for (String mainPart: mainParts) {
        // Check if each part contains '-' character
        if (mainPart.contains("-")) {
            // If contains '-', split and add the 2 parts to 2 arrays
            String[] subParts = mainPart.split("-");
            list1.add(subParts[0]);
            list2.add(subParts[1]);

        } else {
            // If does not contain '-', add complete part to 1st array and add placeholder to 2nd array
            list1.add(mainPart);
            list2.add("0");
        }
    }

    // Build the final Strings by joining String parts by commas and enclosing between parentheses
    String str1 = "{" + String.join(",", list1) + "}";
    String str2 = "{" + String.join(",", list2) + "}";

    System.out.println(str1);
    System.out.println(str2);

【讨论】:

    【解决方案3】:

    根据您构建问题的方式,您实际上应该首先用逗号分隔。然后,您应该遍历对split 的调用结果,如果存在的话,用连字符分割输出数组中的每个字符串。如果没有连字符,则可以将0 添加到字符串 2,将字符串本身添加到字符串 1。如果有连字符,则将左侧添加到字符串 1,将右侧添加到字符串 2。这是一种方法可以做到这一点,

    if(rawIndication.contains(",")){
        String s1 = "{";
        String s2 = "{";
        String[] parts = rawIndication.split(",");
        for(int i = 0; i < parts.length; i++) {
            if(parts[i].contains("-") {
                String[] moreParts = parts[i].split(",");
                s1 = s1 + moreParts[0] + ",";
                s2 = s2 + moreParts[1] + ",";
            }
            else{
                s1 = s1 + parts[i] + ",";
                s2 = "0,";
            }
        }
        s1 = s1.substring(0, s1.length() - 1); //remove last extra comma
        s2 = s2.substring(0, s2.length() - 1); //remove last extra comma
        s1 = s1 + "}";
        s2 = s2 + "}";
    }
    

    【讨论】:

      【解决方案4】:

      我认为这可以解决您的问题。

      private static void splitStrings() {
         List<String> list = Arrays.asList("aa-bb", "ccdd", "eeff", "gg-gg", "cc-gg");
          List firstPartList = new ArrayList<>();
          List secondPartList = new ArrayList<>();
          for (String undividedString : list){
              if(undividedString.contains("-")){
                  String[] dividedParts = undividedString.split("-");
                  String firstPart = dividedParts[0];
                  String secondPart = dividedParts[1];
                  firstPartList.add(firstPart);
                  secondPartList.add(secondPart);
              } else{
                  firstPartList.add(undividedString);
                  secondPartList.add("0");
              }
          }
      
          System.out.println(firstPartList);
          System.out.println(secondPartList);
      }
      

      输出为 -

      [aa, ccdd, eeff, gg, cc]
      [bb, 0, 0, gg, gg]
      

      【讨论】:

      • 输入存储为字符串,而不是列表。
      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多