dzierzak
dzierzak

Reputation: 79

How to sort List<List<String>> by first element of every list?

How can I sort List of Lists by first element of every list? I have list like this:

[angel, angle, galen, glean, lange]
[abel, able, bale, bela, elba]
[elan, lane, lean, lena, neal]
[caret, carte, cater, crate, trace]
[evil, levi, live, veil, vile]
[alger, glare, lager, large, regal]

And I want to

[abel, able, bale, bela, elba]
[alger, glare, lager, large, regal]
[angel, angle, galen, glean, lange]
[caret, carte, cater, crate, trace]
[elan, lane, lean, lena, neal]
[evil, levi, live, veil, vile]

How can I do this using Stream?

Here is my code:

List<List<String>> lis = new ArrayList();

stream.collect(Collectors.groupingBy(s -> getAnagramKey(s)))
    .values().stream()
    .sorted(Collections.reverseOrder(Comparator.comparingInt(List::size)))
    .limit(15)
    .forEach(e -> {
    lis.add(e);
 });

final int maxSize = lis.stream().map(List::size).max(Integer::compare).orElse(0);

lis.stream()
    .filter(e -> e.size() == maxSize)
    .forEach(System.out::println
);

Upvotes: 0

Views: 376

Answers (1)

Sweeper
Sweeper

Reputation: 271030

You could just call Comparator.comparing for this:

List<List<String>> sortedList = 
    lis.stream().sorted(Comparator.comparing(x -> x.get(0)))
        .collect(Collectors.toList());

You don't need streams if you just want to sort the list in place. List.sort will do the job:

lis.sort(Comparator.comparing(x -> x.get(0)));

Also, don't use raw types. Write ArrayList<>, not ArrayList:

List<List<String>> lis = new ArrayList<>();

Upvotes: 3

Related Questions