Сортировка строк листа начиная с заданного элемента в строке
Необходимо отсортировать 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());
}
Сортировка листа строк по второму слову:
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