Zamiana mapy <String, List<String>> na <String, Set<String>>

Zamiana mapy <String, List<String>> na <String, Set<String>>
3P
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:72
0

Mam program, który sczytuje z pliku języki programowania i programistów, którzy znają dany język. Poszczególne linijki wrzuciłem do listy List<List<String>>, gdzie pod indeksem 0 jest nazwa języka programowania, kolejne Stringi to programiści.
W pliku specjalnie jest błąd - programista się powtarza, dlatego w mapie końcowej jako wartości potrzebuję Set<String>.

Kopiuj
public Map<String, List<String>> getLangsMap() {
        map = new LinkedHashMap<>();
        for (List<String> i : list) {
            map.put(i.get(0), i.subList(1, i.size()));
        }
        return map;
    } 

Wymyśliłem taką metodą. Jak zamienić ją, aby zwracała Map <String, Set<String>> ?

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
1

Przed i.subList dać new HashSet<>( a na koniec linijki wtedy )

3P
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:72
0

@Pinek: kolega właśnie mi podpowiedział coś takiego: map.put(i.get(0), i.subList(1, i.size()).stream().collect(Collectors.toSet()));

PI
Też może być, na to samo wyjdzie ;]
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:10 dni
  • Postów:3277
2

Przechowywanie w pojedynczej liście wartości o różnych znaczeniach (język i programista) to robienie sobie dodatkowej roboty. Jak lecisz przez ten plik, to co za problem od razu dodawać wartości do mapy Map<String, Set<String>? Pobierasz wcześniej wcześniej ospowiedni set, jak go nie ma, to tworzysz nowy, na koniec wstawiasz przy użyciu takiej metody:

Kopiuj
    private Map<String, Set<String>> langsProgrammers = new HashMap<>();
    
    public void addProgrammers(String lang, String programmer){
        langsProgrammers.computeIfAbsent(lang, k -> new HashSet<>()).add(programmer);
    }
3P
w zadaniu jest napisane, że konstruktor ma służyć do wczytania pliku, także wybrałem listę jako najbardziej uniwersalną kolekcję. metody służą do modyfikacji i tworzenia odpowiednich setów
piotrpo
Teoretycznie String jest w stanie przyjąć dowolny typ danych, ale to nie znaczy, że masz tak robić. zrób sobie klasę z polem i metodą jak wyżej, w konstruktorze, jak już musisz, to wczytaj ten plik i wrzucaj.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Ja bym poszedł jeszcze dalej. Trzymanie w liscie różnych rzeczy to bardzo zły pomysł, ale używanie jakiegoś Map<String,Set<String>> też jest słabe bo co to za stringi? Nie ładnie byłoby mieć Map<Language, Set<Programmer>> albo Map<Langauge, Programmers>? :) Nagle nie trzeba się zastanawiać czy to jest mapa język->programiści czy może programista->języki.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.