Zliczanie powtórzeń w TreeMap

0

Mam TreeMap do której jako klucz wrzucam numer zdania a jako wartość podaję ilość wyrazów w tym zdaniu. I tu pojawia się problem bo mam zliczyć że np 10 zdan ma 5 wyrazów a 2 maja 30 i za bardzo nie wiem jak to zrobić. Klucze są oczywiście różne ale wartości czasem się powtarzają.

0

Coś takiego:

Iterator<Integer> it = map.keySet().iterator();

Korzystając z metod hasNext i next wędrujesz po iteratorze i liczysz:

HashMap<Integer, Integer> counters = new HashMap<Integer, Integer>();
while(it.hasNext())
{
    int words = map.get(it.next());
    counters.put(words, counters.getOrDefault(words, 0) + 1);
}
0
bogdans napisał(a):

Coś takiego:

Iterator<Integer> it = map.keySet().iterator();

Korzystając z metod hasNext i next wędrujesz po iteratorze i liczysz.

Czyli robię pętlę for i co dalej bo za bardzo nie ogarniam

0

Właśnie sobie uprzytomniłem, że jesteś początkujący i uzupełniłem swój post.

0
bogdans napisał(a):

Właśnie sobie uprzytomniłem, że jesteś początkujący i uzupełniłem swój post.

Dzięki wielkie :)

0

ok twój kod działa jak należy ale teraz nie wiem jak to wypisać w interesującej mnie formie.
coś takiego:

System.out.println(licz.values()+" zdań\n"+licz.keySet()+" słów");

wypisuje dwie tablice, a ja chciałbym w formie klucz = ilość wyrazów

Problem rozwiązany:

for(Entry<Integer, Integer> entry : licz.entrySet())
System.out.println(entry.getValue()+" zdań "+entry.getKey()+" słów");

Dzięki za pomoc

0

IMO trochę od złej strony podeszliście :) TreeMap to mapa, a z mapą można zrobić tak:

public class TreeMapCounting {

    public static void main(String[] args) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        map.put(1, 2);
        map.put(2, 4);
        map.put(3, 2);
        map.put(4, 4);
        map.put(5, 2);

        Map<Integer, List<Map.Entry<Integer, Integer>>> byValue = map.entrySet().stream()
                .collect(Collectors.groupingBy(Map.Entry::getValue));
        byValue.entrySet().stream()
                .forEach(e-> System.out.printf("Zdania o %d słowach to: %s%n", e.getKey(), 
                        e.getValue().stream().map(Map.Entry::getKey).collect(Collectors.toList())));
    }
}

Najpierw grupujemy po liczbie słów, a następnie wypisujemy. Drugi element w printf to pobranie listy kluczy z oryginalnej mapy. Można to trochę uprościć, by nie był to taki Kropek, ale to już szczegół.

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