【问题标题】:Split String after every x Digits每 x 位后拆分字符串
【发布时间】:2018-05-20 13:44:28
【问题描述】:

我有一个小问题。我需要将字符串拆分为 x 部分并将其添加在一起。编辑:如果我想用 x=3 拆分它,那么我需要 4 个部分,但如果我想用 x=4 拆分它,那么我需要 3 个部分。所以我的硬编码代码很糟糕。 我的 x 总是我的字符串长度的倍数(3 是 009056737152 的倍数 - 长度 12)

示例:字符串:“009056737152”和地址长度 = 3;意味着我必须在 3 个数字后拆分字符串。 009 056 737 152 然后我必须从右到左将这些加在一起:251 + 737 + 650 + 009 = 1647。我的代码实际上无法正常工作。还有其他想法吗?

    int adresslength = 3;
    String str = "009056737152"; System.out.println(str);
    String result = str.substring(0,str.length() - adresslength - adresslength - adresslength );
    String result2 = str.substring(adresslength,str.length() + -adresslength -adresslength );
    String result3 = str.substring(adresslength + adresslength,str.length() +  -adresslength  );
    String result4 = str.substring(adresslength + adresslength + adresslength,str.length()  );
    System.out.println(result); System.out.println(result2);System.out.println(result3);System.out.println(result4);

【问题讨论】:

  • 哪个部分不工作?分裂?
  • 字符串的长度是否总是地址长度的倍数?
  • 是的,总是倍数,当我更改 int 地址长度时它不起作用。它仅适用于 int adresslength = 3
  • String result3 = str.substring(adresslength + adresslength,str.length() +adresslength -6); 如果在您更改长度时它不起作用,因为在这里您硬编码了6,这仅在地址长度为3 时才有效
  • 谢谢我纠正了它,但它仍然只适用于 3 或 2

标签: java string split numbers add


【解决方案1】:
    public static void main(String[] main){
         int adresslength = 3;
         String str = "009056737152"; System.out.println(str);
         int result = 0;
         for(int i=0;i<str.length();i+=adresslength){
             String subString = str.substring(i , i+adresslength);
             String nSString = new String();
             for(int j=subString.length()-1;j>=0;j--){
                 nSString += subString.charAt(j);
             }
             result+=Integer.valueOf(nSString);
         }
         System.out.println(result);
    }

您可以将地址长度更改为 2、4、5,并根据您的要求另外添加约束,例如地址长度将是按字符串长度的模块等等。

【讨论】:

    【解决方案2】:

    如果你先计算一个零件的大小,你可以很容易地计算零件的范围。

    public static String[] partitionByCount(String input, int count) {
        if (count <= 0)
            throw new IllegalArgumentException("Invalid count: " + count);
        int size = input.length() / count;
        if (size * count != input.length())
            throw new IllegalArgumentException("String of length " + input.length() +
                    " cannot be split into " + count + " equally-sized parts");
        String[] parts = new String[count];
        for (int i = 0; i < count; i++)
            parts[i] = input.substring(i * size, (i + 1) * size);
        return parts;
    }
    

    测试

    System.out.println(Arrays.toString(partitionByCount("009056737152", 2)));
    System.out.println(Arrays.toString(partitionByCount("009056737152", 3)));
    System.out.println(Arrays.toString(partitionByCount("009056737152", 4)));
    

    输出

    [009056, 737152]
    [0090, 5673, 7152]
    [009, 056, 737, 152]
    

    如果你想指定分区大小而不是分区计数,代码很容易调整:

    public static String[] partitionBySize(String input, int size) {
        if (size <= 0)
            throw new IllegalArgumentException("Invalid size: " + size);
        int count = input.length() / size;
        if (count * size != input.length())
            throw new IllegalArgumentException("String of length " + input.length() +
                    " cannot be split into equally-sized parts of length " + size);
        String[] parts = new String[count];
        for (int i = 0; i < count; i++)
            parts[i] = input.substring(i * size, (i + 1) * size);
        return parts;
    }
    

    测试

    System.out.println(Arrays.toString(partitionBySize("009056737152", 2)));
    System.out.println(Arrays.toString(partitionBySize("009056737152", 3)));
    System.out.println(Arrays.toString(partitionBySize("009056737152", 4)));
    

    输出

    [00, 90, 56, 73, 71, 52]
    [009, 056, 737, 152]
    [0090, 5673, 7152]
    

    然后对反转的部分求和,将输入反转,分区,然后求和会更容易:

    public static int sumReversedPartitions(String input, int size) {
        String reversed = new StringBuilder(input).reverse().toString();
        String[] parts = partitionBySize(reversed, size);
        return Arrays.stream(parts).mapToInt(Integer::parseInt).sum();
    }
    

    测试

    System.out.println(sumReversedPartitions("009056737152", 2));
    System.out.println(sumReversedPartitions("009056737152", 3));
    System.out.println(sumReversedPartitions("009056737152", 4));
    

    输出

    153         // 25 + 17 + 37 + 65 + 09 + 00
    2538        // 251 + 737 + 650 + 900
    7182        // 2517 + 3765 + 0900
    

    【讨论】:

      【解决方案3】:

      或许,这段代码可以解决你的问题...

          int adresslength = 3;
          String str = "009056737152";
          System.out.println(str);
          String[] result = new String[str.length() / adresslength];
          int j = 0;
          for (int i = 0; i < str.length();) {
              result[j] = str.substring(i, (i + adresslength));
              char[] aux = new char[adresslength];
              int k2 = 0;
              for (int k = aux.length - 1; k >= 0; k--) {
                  if ((j == 0)) {
                      aux[k2] = result[j].charAt(k2);
                      k2++;
                  }else{
                      aux[k2] = result[j].charAt(k);
                      k2++;
                  }
      
              }
              result[j] = String.copyValueOf(aux);
              i = i + adresslength;
              System.out.println(result[j]);
              j++;
          }
      
          int aux = 0;
          for (String string : result) {
              aux += Integer.valueOf(string);
          }
          System.out.println(aux);
      

      【讨论】:

      • 谢谢:D 这太好了
      • 如果数字超过我的地址长度,您知道如何削减结果。示例:adresslength= 3 但结果为 1647(长度 4)。我怎样才能减少第一个数字,只得到 647
      • 嗯...在最后的字符串中添加这些行sumString = String.valueOf(aux); while(sumString.length() &gt; adresslength){ sumString = sumString.substring(1, sumString.length()); }
      【解决方案4】:

      这是使用 Java 8 流的较短版本。

      public static int splitNumber(String s, int length) {
          s = new StringBuilder(s).reverse().toString();
          return IntStream.iterate(0, i -> i + length)
                  .mapToObj(start -> s.substring(start, start + length))   // Take the i-th substring
                  .mapToInt(Integer::parseInt)                             // Turn into int
                  .limit(s.length() / length)                              // Limit the number of parts
                  .sum();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-09
        • 2018-02-20
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多