Сортировка строк листа начиная с заданного элемента в строке

Необходимо отсортировать ArrayList<String> по алфавиту, но не с первого элемента (слова) строки, а например, со второго. То есть list:

QQQ WWW EEE RRR.
AAA SSS DDD FFF.
ZZZ XXX CCC VVV.
RRR TTT YYY UUU.

на выходе должен стать:

AAA SSS DDD FFF.
RRR TTT YYY UUU.
QQQ WWW EEE RRR.
ZZZ XXX CCC VVV.

Я хотел сделать это так: создать двумерный массив из разбитых по словам строк, далее свапнуть второе слово с первым в каждой строке, отсортировать по алфавиту, затем повторно свапнуть второе с первым и закинуть в list.

ArrayList<String> list = new ArrayList<>();

String[] listToArray = Arrays.toString(list.toArray()).split(" ");
String[][] splitLine = new String[list.size()][];

int listSize = 0;

for (int i = 0; i < list.size(); i++) {
    for (int j = 0; j < list.get(i).split(" ").length; j++) {
        splitLine[i][j] = listToArray[listSize++];
    }
}
System.out.println(Arrays.toString(splitLine));

Вылетает NPE.


Ответы (2 шт):

Автор решения: Дмитрий

Можно, к примеру, так... Пишем метод, передаем исходную коллекцию и позицию для сортировки (в вашем случае 1 - индекс после сплита), получаем отсортированный список. Я не знаю никаких подробностей о том, что у вас за данные, поэтому использую сплит , как и вы, но вы можете это легко изменить.

public static List<String> sort (List<String> list, int position) {
    return list.stream()
            .sorted((s1, s2) -> s1.split(" ")[position].compareTo(s2.split(" ")[position]))
            .collect(Collectors.toList());
}
→ Ссылка
Автор решения: Podushkoved

Сортировка листа строк по второму слову:

ArrayList<String> list = new ArrayList<>();
list.add("QQQ WWW EEE RRR");
list.add("AAA SSS DDD FFF");
list.add("ZZZ XXX CCC VVV");
list.add("RRR TTT YYY UUU");

list.stream()
    .sorted(Comparator.comparing(str -> str.split("\\s+")[1]))
    .forEach(System.out::println);

// AAA SSS DDD FFF
// RRR TTT YYY UUU
// QQQ WWW EEE RRR
// ZZZ XXX CCC VVV
→ Ссылка