• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wymuszanie stabilnego sortowania

Object Storage Arubacloud
0 głosów
114 wizyt
pytanie zadane 29 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)

Cześć,

mam za zadanie napisać metodę nakładkową, której rolą będzie wymuszanie stabilnego sortowania niezależnie od jego rodzaju.

W tym celu stworzyłem klasę, która ma dwa pola: jedno na obiekt wg. którego ma nastąpić sortowanie, drugi na index, który jest dołączany do każdego elementu. 

Pomysł jest taki, że przekazując dane do posortowania, metoda nakładkowa tworzy nową tablicę, której wartościami są obiekty klasy Overlay.  Następnie jest sortowanie wg. wartości kluczy. Potem metoda iteruję poprzez kolejne pola tablicy szukając takich samych elementów, jeżeli je znajduje, sortuje je wg. wartości nadanych  indexów  w klasie nakładkowej. 

Kod rozwiązania: 

Klasa nakładkowa:

public class Overlay <Key extends  Comparable<Key>> implements Comparable<Overlay> {

    private static int counter = 0;

    public int index;
   public Key item;

    public Overlay(Key item)
    {
        this.item = item;
        index = counter++;
    }

    @Override
    public String toString() {
        return  item.toString() + " " +index;
    }

    @Override
    public boolean equals(Object obj) {
        return item.equals(obj);
    }

    @Override
    public int compareTo(Overlay o) {
        return item.compareTo((Key) o.item);
    }
}

Klasa z metodą nakładkową:

public class MakeStable <Key extends  Comparable<Key>>{

    public ArrayList<Key> sort (ArrayList<Key> a )
    {
      ArrayList<Overlay<Key>> temp = new ArrayList<>();

        for (int i = 0; i < a.size(); i++)
            temp.add(new Overlay<>(a.get(i)));

      Collections.sort(temp); //sortowanie wg. kluczy
      this.makeOrder(temp);

      a = new ArrayList<>();
        for (int i = 0; i < temp.size(); i++)
            a.add(temp.get(i).item);
    return a;
    }

    private void makeOrder(ArrayList<Overlay<Key>> a)
    {
        class IndexComparator implements Comparator<Overlay> {
            @Override
            public int compare(Overlay o1, Overlay o2) {
                return Integer.compare(o1.index,o2.index);
            }
        }
        int range = 0;
        for (int i = 0; i < a.size()-1; i++)
        {
            if (a.get(i).compareTo(a.get(i+1)) == 0)
                 continue;
            else range++;

            if(i > range-1)
            {
                Collections.sort(a.subList(range-1,i+1),new IndexComparator()); //sortowanie równych elementów wg. wartości indexów
                range = i+1;
            }
        }
    }
}

Czy przedstawione przeze mnie rozwiązanie jest waszym zdaniem poprawne? Co można było by usprawnić? 

 

Pozdrawiam :)) 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 509 wizyt
0 głosów
2 odpowiedzi 2,182 wizyt
pytanie zadane 14 kwietnia 2017 w Algorytmy przez ArturoS159 Początkujący (440 p.)
0 głosów
0 odpowiedzi 378 wizyt

92,555 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...