Как преобразовать / отсортировать строку на основе двух символов в Java? - PullRequest
0 голосов
/ 14 января 2019

У меня есть следующая строка:

String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";

И я пытаюсь преобразовать его в:

String converted = "aaa,bbb,ccc\n111,222,333\nxxx,yyy,zzz";

Чтобы быть как-то отсортировано. Это то, что я пробовал до сих пор:

String[] parts = string.split("\\n");
List<String[]> list = new ArrayList<>();
for(String part : parts) {
    list.add(part.split(","));
}

for(int i = 0, j = i + 1, k = j + 1; i < list.size(); i++) {
    String[] part = list.get(i);
    System.out.println(part[i]);
}

Так что мне удалось получить первый элемент от каждого «юнита» отдельно. Но как получить все и заказать их, чтобы я получил этот результат?

Может ли это быть еще проще при использовании Java8?

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 14 января 2019

Класс Pattern дает возможность потоковой передачи напрямую с разделением String s.

String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
Pattern commaPattern = Pattern.compile(",");
String sorted = Pattern.compile("\n").splitAsStream(string)
    .map(elem -> commaPattern.splitAsStream(elem).sorted().collect(Collectors.joining(",")))
    .collect(Collectors.joining("\n"));
0 голосов
/ 14 января 2019
    String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
    String converted = Arrays.stream(string.split("\\n"))
            .map(s -> Arrays.stream(s.split(","))
                    .sorted()
                    .collect(Collectors.joining(",")))
            .collect(Collectors.joining("\\n"));
0 голосов
/ 14 января 2019

Вы можете иметь его по старинке без использования Java 8 вот так:

public static void main(String[] args) {
    String s = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
    System.out.println(sortPerLine(s));
}

public static String sortPerLine(String lineSeparatedString) {
    // first thing is to split the String by the line separator
    String[] lines = lineSeparatedString.split("\n");

    // create a StringBuilder that builds up the sorted String
    StringBuilder sb = new StringBuilder();

    // then for every resulting part
    for (int i = 0; i < lines.length; i++) {
        // split the part by comma and store it in a List<String>
        String[] l = lines[i].split(",");
        // sort the array
        Arrays.sort(l);
        // add the sorted values to the result String
        for (int j = 0; j < l.length; j++) {
            // append the value to the StringBuilder
            sb.append(l[j]);
            // append commas after every part but the last one
            if (j < l.length - 1) {
                sb.append(", ");
            }
        }
        // append the line separator for every part but the last
        if (i < lines.length - 1) {
            sb.append("\n");
        }
    }

    return sb.toString();
}

Но все же, на мой взгляд, предпочтительнее Java 8, поэтому придерживайтесь одного из других ответов.

0 голосов
/ 14 января 2019

Я думаю, один из способов сделать это будет:

String result = Arrays.stream(string.split("\\n"))
                          .map(s -> {
                              String[] tokens = s.split(",");
                              Arrays.sort(tokens);
                              return String.join(",", tokens);
                          })
                          .collect(Collectors.joining("\\n"));

System.out.println(result); // aaa,bbb,ccc\n111,222,333\nxxx,yyy,zzz

Просто обратите внимание, что в случае, если ваши шаблоны более сложные, чем \n или , - это хорошая идея, чтобы извлечь эти отдельные Pattern (s)

...