SPOJ_IMIONA(Zadanie)

0

Witam, mam mały problemik z zadaniem http://pl.spoj.com/problems/NAMES/ . Mój problem polega na tym, że nie wiem jak posortować Map'e po wartościach(Integer) od najwiekszego do najmniejszego i jeśli wartości są takie same dla różnych kluczy(String) to wtedy posortować dla tych samych wartości według klucza.
Mój kod:

String[] rekordy = new String[7]; // probna lista do sprawdzenia

        rekordy[0]="1. KowalSki JaCEk";
        rekordy[1]="2. mazurkiewicz pIoTR";
        rekordy[2]="3. prokoP ANna";
        rekordy[3]="4. MisioL annA";
        rekordy[4]="5. BerezOwSki jaCEK";
        rekordy[5]="6. pietraS ANNA";
        rekordy[6]="7. WILkowsKA aneta";

        Map<String,Integer> wyniki = new LinkedHashMap<>();
        // Imię to klucz, a wartość ilość jego powtórzeń w tablicy rekordy
        // Jeśli mapa nie posiada danego klucza to dodaje go key = [imie] value=1 (domyślnie)
        // Jeśli imię(klucz) już istnieje to inkrementuj wartość dla tego klucza o jeden
        for (int i = 0; i < rekordy.length; i++) {
            rekordy[i]=rekordy[i].replaceAll("[A-z,1-9,.]*[ ]","").toUpperCase();
            if(!wyniki.containsKey(rekordy[i]))
            {
                wyniki.put(rekordy[i],1);
            }else
            {
                wyniki.put(rekordy[i],wyniki.get(rekordy[i]).intValue()+1);
            }
        }
//TODO: Posortować map'e
1

Mapy się nie da sortować. Ja bym przerzucił pary z mapy do listy i posortował według wartości inta customowym comparatorem.

2

.entrySet() daje ci zbiór par <klucz, wartość> i taki zbiór możesz zamienic na listę i sortować jakimś swoim komparatorem

0

Udało się posortować, teraz nie mam zielonego pojęcia jak sprawić, żeby SPOJ mógł sobie wstawić własne dane do programu. Kombinuje to tak zrobić, ale nie wiem czy to jest poprawne (cały kod do tego zadania, lecz pojawia się komunikat błędna odpowiedź, nie wiem czy jest to związane z źle pobranymi danymi czy sam algorytm nawala):

public static void main(String[] args) {

        List<String> names = Arrays.asList(args);

        Map<String, Integer> wyniki = new LinkedHashMap<>();
        
        for (int i = 0; i < names.size(); i++) {
            names.set(i,names.get(i).replaceAll("[A-z,1-9,.]*[ ]", "").toUpperCase());
            if (!wyniki.containsKey(names.get(i))) {
                wyniki.put(names.get(i), 1);
            } else {
                wyniki.put(names.get(i), wyniki.get(names.get(i)).intValue() + 1);
            }
        }

        Set<Map.Entry<String, Integer>> entries = wyniki.entrySet();

        List<Map.Entry<String, Integer>> entries2;
        entries2 = entries.stream().sorted(
                Comparator.comparing((Map.Entry<String,Integer> p)->p.getValue()).reversed()
                        .thenComparing((Map.Entry<String,Integer> p)->p.getKey()))
                .collect(Collectors.toList());
        for (Map.Entry<String, Integer> e :
                entries2) {
            System.out.println(e.getKey()+" "+e.getValue());
        }

    }
0

Czemu nie lecisz od razu po tablicy args? Nie ma większego sensu konwertowanie tego na listę.

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