Skocz do zawartości

[Java] Mechanizmy sortowania - trudności z implementacją komparatorów


RIP

Polecane posty

Cześć!

Sprawa polega na tym, że na studiach mamy teraz zadania związane z analizą wydajności różnych algorytmów sortowania. Na pierwszy ogień poszły bąbelkowe, przez wybieranie i przez wstawianie. Mamy napisać klasy dla odpowiedniego typu sortowania, potem w konstruktorze połączyć je z danym komparatorem (np. jeden komparator porównuje studentów po ocenie, a drugi po indeksie) i wg klucza komparatora posortować daną np. ArrayListę 500000 elementów. No i mam problem głównie z mainem, czyli programem testowym, bo nie wiem, jak to ze sobą połączyć, żeby grało.

Mam parę klas, które zaraz wkleję. Są to BubbleSort definiujący algorytm sortowania bąbelkowego, prosty interfejs Comparator, klasę student implementującą ten interfejs i mającą metodę Compare.


import java.util.ArrayList;
public class BubbleSort {

private final Comparator comparator;

public BubbleSort(Comparator comparator) {
this.comparator = comparator;
}

public ArrayList<Student> sort(ArrayList<Student> list) {
int size = list.size();
for (int pass = 1; pass < size; ++pass) {
for (int left = 0; left < (size - pass); ++left) {
int right = left + 1;
if (comparator.compare(list.get(left), list.get(right)) > 0)
swap(list, left, right);
}
}
return list;
}

public int compare(Object left, Object right) throws ClassCastException
{ return comparator.compare(left, right); }


private void swap(ArrayList list, int left, int right) {
Object temp = list.get(left);
list.set(left, list.get(right));
list.set(right, temp);
}
}


public class Student implements Comparator<Student> {

int ocena;
int indeks;

public Student(int ocena, int index) {
this.ocena = ocena;
indeks = index;
}

public String toString() {
return "Numer indeksu: " + indeks + " ocena: " + ocena + "\n";
}

public int getIndeks() {
return indeks;
}

public int getOcena() {
return ocena;
}

public int compare(Student left, Student right) {
if (left.getIndeks()<right.getIndeks()) {
return -1;
}
if (left.getIndeks() == right.getIndeks()) {
return 0;
}
else {
return 1;
}
}

}


public interface Comparator<T> {
public int compare(T left, T right) throws ClassCastException;
}


import java.util.Random;
import java.util.ArrayList;
public class Program {
public static void main(String[] args) {
int elementy = 500000;
ArrayList<Student> lista = new ArrayList<Student>();
Random rand = new Random();
for (int i=0; i<elementy; i++) {
lista.add(new Student(rand.nextInt(4)+2, rand.nextInt(900000)));
}
System.out.println(lista);
}

}

W mainie, jak widać, mam ledwo stworzoną losową ArrayListę ze studentami. Nie wiem, jak zarzucić tam BubbleSorta, żeby to się posortowało. Mamy to zrobić właśnie wg takiej filozofii. Klasy inny sortowań z algorytmami oczywiście sobie sam dorzucę, a implementacja będzie identyczna jak przy BubbleSort...tylko, że nie wiem, jak to BS zaimplementować w tym mainie :)

No i druga sprawa...czy to Compare w Studencie to dobre podejście? :/ Zdaje się, że powinienem to zrobić chyba inaczej, bo teraz jeśli będę chciał posortować po ocenie zamiast po indeksie, będę musiał zmienić metodę compare :/

Link do komentarza
Udostępnij na innych stronach

Bo zamieściłem w niej metodę Compare, ale faktycznie to był błąd, o czym pisałem w końcówce posta powyżej i zrobiłem sobie parę różnych niezależnych komparatorów od sortowania to wprzód to w tył albo indeksów, albo ocen. I tak naprawdę, to problem się niedawno rozwiązał, bo odpowiedzi dość długo nie było i udało mi się na to wpaść. Teraz w mainie wywołuję sobie np. BubbleSort, gdzie w argumencie wywołuję konstruktor danego comparatora, a potem wywołując metodę sort BubbleSorta podaję w argumencie listę. No i się sortuje ładnie. Także problem załatwiony :)

Link do komentarza
Udostępnij na innych stronach

No bo w bubblesorcie mam cały algorytm sortowania bubelkowego niezależny od tego, co jest sortowane. Po zadaniu danego komparatora on się dostosowuje. No tak - nie mogę jednym bubblesortem realizować porównywania przy pomocy różnych komparatorów :)

Link do komentarza
Udostępnij na innych stronach

Dlatego napisałem prawie dobrze smile_prosty.gif

A jakbyś metodę sort zrobił statyczną, a komparator przekazywał jako parametr?

Oczywiście zdaję sobie sprawę, że to program na zaliczenie i tak też jest ok. Zresztą metoda statyczna też ma swoje wady, przede wszystkim nie jest polimorficzna.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...