Problem z sortowaniem strumieniem

0

Jak mogę napisać poniższe wyrażenie aby było dobrze. Bład który dostaje teraz to :
Error:(70, 79) java: incompatible types: java.util.Comparator<java.util.Map.Entry<java.lang.String,java.lang.Integer>> cannot be converted to java.util.Comparator<? super java.lang.String>

 Map<String, Integer> counter = records.stream()
                .map(r -> r.getName().substring(0,1))
                .limit(1)
                .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) . -> dla czego nie mogę użyć tu sortowania
                .collect(groupingBy(
                        Function.identity(),
                        Collectors.counting()
                ));

Ogólnie chce wyciągnąć literę która najczęściej się powtarza

1
  1. To co napisałeś nie ma sensu w ogóle. limit(1) zostawi ci jeden element w strumieniu, więc robienie na nim potem sorted i grouping by to jakaś bzdura.
  2. Przecież zrobiłeś wcześniej map więc teraz w strumieniu masz już tylko stringi zawierające pierwszą literkę imienia z tych wejściowych recordów. Siłą rzeczy comparator z mapy nijak się nie nadaje do sortowania tego

Ogólnie chce wyciągnąć literę która najczęściej się powtarza

Tzn? Tak jak napisałeś, chodzi o pierwszą literę imienia czy w ogóle ze wszystkich liter? Pokaż przykład.

Plus ty chyba nie rozumiesz że KOLEJNOŚĆ operacji na strumieniu ma znaczenie. Zgaduje że sortowanie i limt chciałeś dać PO ZGRUPOWANIU a nie PRZED nim.

0

@Shalom: "najpierw wyciągasz pierwszą literę, POTEM grupujesz i zliczasz" To jest dobrze ? -> Map<String, Long> counter = records.stream()
.map(r -> r.getName().substring(0,1))
.collect(groupingBy(Function.identity(),Collectors.counting()));
I nie wiem jak teraz dać tego max albo sortowanie i limit ?

0

Do zliczania ilosci wystapien elementow uzyj merge

3
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

class Person {
    private final String name;

    Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Names {

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(new Person("Ala"), new Person("Ola"), new Person("Ula"), new Person("Andrzej"));
        Map.Entry<String, Long> letter = people.stream()
                .map(Person::getName)
                .map(x -> x.substring(0, 1))
                .collect(Collectors.groupingBy(
                        Function.identity(),
                        Collectors.counting()
                ))
                .entrySet()
                .stream()
                .max(Map.Entry.comparingByValue())
                .orElseThrow(() -> new RuntimeException("No result"));
        System.out.println(String.format("Letter %s and score %d", letter.getKey(), letter.getValue()));
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1