SPOJ_IMIONA(Zadanie)

SPOJ_IMIONA(Zadanie)
S1
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:38
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:

Kopiuj
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
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 4 godziny
  • Postów:6695
1

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


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S1
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:38
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):

Kopiuj
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());
        }

    }
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 4 godziny
  • Postów:6695
0

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


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine

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.