Разделить строку после каждого x цифр - PullRequest
0 голосов
/ 20 мая 2018

У меня маленькая проблема.Мне нужно разбить строку на х частей и сложить вместе.РЕДАКТИРОВАТЬ: если я хочу разделить его с х = 3, то мне понадобится 4 части, но если я хочу разделить его с х = 4, то мне понадобятся 3 части.Так что мой жесткий код плох.и мой x всегда кратен моей длине строки (3 - кратно 009056737152 - длина 12)

Пример: строка: "009056737152" и длина адреса = 3;означает, что я должен разделить строку после 3 чисел.009 056 737 152, а затем мне нужно сложить это справа налево: 251 + 737 + 650 + 009 = 1647. Мой код на самом деле не работает porperly.Любые другие идеи?

    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);

Ответы [ 4 ]

0 голосов
/ 20 мая 2018

Вот более короткая версия с использованием потоков 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();
}
0 голосов
/ 20 мая 2018

Если вы сначала рассчитаете размер детали, вы можете легко рассчитать диапазоны деталей.

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
0 голосов
/ 20 мая 2018
    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 и дополнительно добавить ограничения, поскольку ваши требования, такие как длина адреса, будут зависеть от длины строки и т. Д.

0 голосов
/ 20 мая 2018

Возможно, этот код решит вашу проблему ...

    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);
...