import java.util.*; public class Searcher implements SearchOperations{ private final Map recByTitle = new HashMap<>(); private SortedMap> recByYear = new TreeMap<>(); private Map> recByArtis = new HashMap<>(); private Map> recByGenres = new HashMap<>(); //Gamla //private final Map> recordingHashByArtist = new HashMap<>(); //private final Map> recordingTreeByTitle = new TreeMap<>(); public Searcher(Collection data) { Collection recordings = data; //Loopa igenom och lägg till i olika set for(Recording r: recordings) { recByTitle.put(r.getTitle(), r); //Lägg till år i map med nestad set Set set = recByYear.get(r.getYear()); if(set == null) { set = new HashSet<>(); recByYear.put(r.getYear(), set); } set.add(r); //Lägg till artist i map nestad set Set sameArtist = recByArtis.get(r.getArtist()); if(sameArtist == null) { sameArtist = new HashSet<>(); recByArtis.put(r.getArtist(), sameArtist); } sameArtist.add(r); //Lägg till genre i map nestad set for (String genre: r.getGenre()) { Set sameGenre = recByGenres.get(genre); if(sameGenre == null) { sameGenre = new HashSet<>(); recByGenres.put(genre, sameGenre); } sameGenre.add(r); }//for genre } //for r } @Override public long numberOfArtists() { return (long) recByArtis.size(); //Returnera storleken } @Override public long numberOfGenres(){ return (long) recByGenres.size(); } @Override public long numberOfTitles(){ return (long) recByTitle.size(); } @Override public boolean doesArtistExist(String name){ return recByArtis.containsKey(name); //kontrollea om namnet finns som nyckel i hashset } @Override public Collection getGenres(){ return Collections.unmodifiableCollection(recByGenres.keySet()); //returnerar omodfierbar samling av genrer } @Override public Recording getRecordingByName(String title) { return recByTitle.get(title); } @Override public Collection getRecordingsAfter(int year){ Set ret = new HashSet<>(); for (Set recs : recByYear.tailMap(year).values()) { ret.addAll(recs); } return Collections.unmodifiableCollection(ret); } @Override public SortedSet getRecordingsByArtistOrderedByYearAsc(String artist){ SortedSet set = new TreeSet<>(Recording.getYearCmp()); set.addAll(recByArtis.get(artist)); return Collections.unmodifiableSortedSet(set); } @Override public Collection getRecordingsByGenre(String genre){ return Collections.unmodifiableCollection(recByGenres.getOrDefault(genre, Collections.emptySet())); } @Override public Collection getRecordingsByGenreAndYear(String genre, int yearFrom, int yearTo) { Set ret = new HashSet<>(); Set sameGengre = recByGenres.get(genre); for(Set recs : recByYear.subMap(yearFrom, yearTo + 1).values()){ recs.retainAll(sameGengre); ret.addAll(recs); } return Collections.unmodifiableCollection(ret); } @Override public Collection offerHasNewRecordings(Collection offered){ Set ret = new HashSet<>(); ret.addAll(offered); for (Set rec : recByYear.values()) { ret.removeAll(rec); } if (ret.isEmpty()) { return Collections.emptySet(); } return Collections.unmodifiableCollection(ret); } @Override public Collection optionalGetRecordingsFrom(int year) { //Kollar om värdet finns annars så returnerar det vi sägger till den att göra, vilket i detta fall är en empty set return Collections.unmodifiableCollection(recByYear.getOrDefault(year, Collections.emptySet())); } }