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

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>.

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>> ?

1

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

0

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

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:

    private Map<String, Set<String>> langsProgrammers = new HashMap<>();
    
    public void addProgrammers(String lang, String programmer){
        langsProgrammers.computeIfAbsent(lang, k -> new HashSet<>()).add(programmer);
    }
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.

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