Utworzenie Listy Map<String, Integer> z List<String>

0

hej, chciałbym utworzyć z List<List<String>> listOfStrings, która przechowuje poszczególne atrybuty: [[slonecznie, snieg, slonecznie, deszcz, snieg, zachmurzenie, zachmurzenie, deszcz, zachmurzenie, deszcz], [niska, wysoka, srednia, srednia, wysoka, wysoka, wysoka, wysoka, niska, niska] itd Listę Map, gdzie Key to będzie String (nazwa atrybutu) a Value (liczba wystąpień danego atrybutu).

Ktoś ma pomysł jak to zrobić?

0

Mamy Listę [slonecznie, snieg, slonecznie, deszcz, snieg, zachmurzenie, zachmurzenie, deszcz, zachmurzenie, deszcz]. Chciałbym z tego utowrzyć listę 4. Map (bo tyle jest różnych słów) z liczbą ich wystąpień. Czyli dla słonecznie = 2, snieg = 2, deszcz = 3, zachmurzenie = 2.

0

Czuje, że będzie ciężko :)

3l3ctric_philip napisał(a):

Mamy Listę [slonecznie, snieg, slonecznie, deszcz, snieg, zachmurzenie, zachmurzenie, deszcz, zachmurzenie, deszcz].
Chciałbym z tego utowrzyć listę 4. Map (bo tyle jest różnych słów) z liczbą ich wystąpień. Czyli dla słonecznie = 2, snieg = 2, deszcz = 3, zachmurzenie = 2.

4 map? Dlaczego?
A moze Jedną mapę która będzie miała 4 pary key <-> value? W której słonecznie = 2, snieg = 2, deszcz = 3, zachmurzenie = 2.

0

moja lista Stringów:
List<List<String>> listOfStrings = new ArrayList<>();

 [[slonecznie, snieg, slonecznie, deszcz, snieg, zachmurzenie, zachmurzenie, deszcz, zachmurzenie, deszcz, snieg, zachmurzenie, zachmurzenie, zachmurzenie, snieg, snieg, deszcz, deszcz, slonecznie, zachmurzenie, zachmurzenie, snieg, deszcz, snieg, snieg, deszcz, zachmurzenie, snieg, snieg, deszcz, snieg, deszcz, snieg, zachmurzenie, slonecznie, zachmurzenie, zachmurzenie, deszcz, slonecznie, deszcz, snieg, zachmurzenie, deszcz, deszcz, zachmurzenie, snieg, snieg, slonecznie, snieg, slonecznie], [tak, tak, tak, nie, tak, tak, tak, tak, nie, nie, tak, tak, tak, tak, tak, tak, tak, nie, tak, tak, nie, tak, tak, nie, nie, nie, nie, tak, tak, tak, nie, tak, nie, tak, tak, tak, tak, tak, tak, tak, nie, tak, nie, nie, nie, tak, nie, nie, tak, tak], [niska, wysoka, srednia, srednia, wysoka, wysoka, wysoka, wysoka, niska, niska, niska, niska, srednia, srednia, niska, wysoka, niska, wysoka, srednia, srednia, wysoka, srednia, wysoka, niska, srednia, wysoka, niska, niska, wysoka, niska, srednia, srednia, niska, srednia, srednia, srednia, wysoka, srednia, srednia, wysoka, srednia, niska, niska, niska, wysoka, wysoka, wysoka, srednia, niska, srednia], [srednia, niska, niska, srednia, srednia, srednia, srednia, srednia, niska, wysoka, niska, niska, wysoka, wysoka, srednia, srednia, srednia, srednia, niska, srednia, wysoka, srednia, srednia, srednia, niska, wysoka, niska, srednia, srednia, srednia, srednia, wysoka, niska, wysoka, wysoka, niska, srednia, srednia, wysoka, niska, srednia, srednia, wysoka, srednia, wysoka, niska, srednia, srednia, niska, wysoka], [tak, nie, tak, nie, nie, tak, tak, nie, tak, nie, nie, nie, tak, tak, tak, tak, nie, nie, tak, tak, tak, tak, nie, tak, nie, nie, tak, tak, tak, nie, tak, nie, nie, tak, tak, tak, tak, nie, tak, nie, tak, tak, nie, nie, tak, nie, tak, tak, nie, nie]]
1

Mi osobiście pachnie ogromym XY Problemem

Odczytuję, ze @kixe52 masz podobny odbiór ???

@3l3ctric_philip:
Podaj przykłady użycia tego wynalazku

(na marginesie, jakby to był mój projekt, bym piernicznął stringi, użył javowskich enumów, które są bardzo mocne, np moga "dziedziczyć" z interfejsu (z tego by fajnie wycisnął podobieństwa / różnice pod-grup parametrów pogody), do tego odważnie przemyślał strukturę danych opartą na typach itd)

0

Zrobiłem

 List<Map<String, Integer>> mapList1 = new ArrayList<>();

 for (int i = 0; i < listOfStrings.size(); i++) {
            Map<String, Integer> frequencyMap = new HashMap<>();
            for (String s : listOfStrings.get(i)) {
                Integer count = frequencyMap.get(s);
                if (count == null) {
                    count = 0;
                }

                frequencyMap.put(s, count + 1);
            }

            mapList1.add(frequencyMap);
        }

w wyniku otrzymuję:

[{slonecznie=7, deszcz=13, snieg=16, zachmurzenie=14}, {nie=17, tak=33}, {niska=16, wysoka=16, srednia=18}, {niska=13, srednia=25, wysoka=12}, {nie=22, tak=28}]
0

Zakładając, że Twoja lista wejściowa wygląda tak:

List<List<String>> listOfStrings = new ArrayList<>(
          List.of(firstList, secondList, third, forth, fifth));

to oczekiwany wynik możesz otrzymać tak:

List<Map<String, Long>> resultMap = new ArrayList<>();
      listOfStrings.forEach(
          list -> {
            Map<String, Long> countingMap = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
            resultMap.add(countingMap);
          }
      );
3

Czyli po prostu chcesz pogrupować kolekcję po wartości z liczeniem wystąpień?

import java.util.Function.identity;
import java.util.stream.Collectors.groupingBy;
import java.util.stream.Collectors.counting;

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

list.add("Chmura");
list.add("Słońce");
list.add("Chmura");
list.add("Chmura");
list.add("Słońce");

Map<String, Long> counted = list.stream().collect(groupingBy(identity(), counting()));

System.out.println(counted); // Chmura=3, Słońce=2

Tylko, że Ty chcesz tą operację wykonać na jeszcze podliście, więc to należałoby zrobić tak

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

List<Map<String, Integer>> result = list.stream()
  .map(list -> {
    // tutaj wykonaj operację z góry, najlepiej zamknij to w funkcji
  })
  .collect(toList());
1

Ogólnie, to proponuję zapoznać się z Enumami (te stringi to tak trochę nie teges...), oraz zastanowić się, czy skoro lista ma zawsze przechowywać 4 wartości (mapy), nie będzie lepiej utworzyć sobie osobnej klasy z odpowiednimi polami, szczególnie, jeżeli każda z tych przechowywanych map ma swoje własne znaczenie.

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