Java: Generischer Bubblesort Algorithmus #2

Zurück zum letzten Post.

Bubblesort einer Integer-ArrayList:

public static void main(String[] args) {
    Bubblesort bubblesort = new Bubblesort(new ArrayList<Integer>(Arrays.asList(7, 3, 88, 8, 1, 5, 0)));
    ArrayList<Integer> sortedList = bubblesort.sort();

    for (Integer v : sortedList)
        System.out.println(v);
}


Hier die Klasse Bubblesort

import java.util.ArrayList;

public class Bubblesort {

    private ArrayList<Integer> arrayList;
    
    public Bubblesort(ArrayList<Integer> arrayList){
        this.arrayList = arrayList;
    }
    
    public ArrayList<Integer> sort() {
        Integer tmp;
        boolean shifted = true;
    
        while (shifted) {
            shifted = false;
            for (int i = 0; i < arrayList.size() - 1; i++) {
                if (arrayList.get(i) > arrayList.get(i + 1)) {
                    tmp = arrayList.get(i + 1);
                    arrayList.set(i + 1, arrayList.get(i));
                    arrayList.set(i, tmp);
                    shifted = true;
                }
            }
        }
        return arrayList;
    }
    
}


ergibt die Ausgabe
0
1
3
5
7
8
88



Sollen nun ArrayLists von verschiedenen Typen verarbeitet werden, sieht das mit Generics so aus:

public static void main(String[] args) {
    Bubblesort bubblesort = new Bubblesort<Integer>(new ArrayList<Integer>(Arrays.asList(7, 3, 88, 8, 1, 5, 0)));
    ArrayList<Integer> sortedList = bubblesort.sort();

    for (Integer v : sortedList)
        System.out.println(v);
}


Mit Generics können neben den normalen Methoden-/Konstruktorparametern Typenparameter im Diamant-Operator übergeben werden, vor dem eigentlichen Methoden-/Konstrukturaufruf. Hier Orange hervorgehoben.

Bubblesort.java

import java.util.ArrayList;

public class Bubblesort<T> {

    private ArrayList<T> arrayList;
    
    public Bubblesort(ArrayList<T> arrayList){
        this.arrayList = arrayList;
    }
    
    public ArrayList<T> sort() {
        T tmp;
        boolean shifted = true;
    
        while (shifted) {
            shifted = false;
            for (int i = 0; i < arrayList.size() - 1; i++) {
                if (arrayList.get(i) > arrayList.get(i + 1)) {
                    tmp = arrayList.get(i + 1);
                    arrayList.set(i + 1, arrayList.get(i));
                    arrayList.set(i, tmp);
                    shifted = true;
                }
            }
        }
        return arrayList;
    }
    
}


Gibt nur ein Problem:
The operator > is undefined for the argument type(s) T, T


Da T ja ein x-beliebiger Objekttyp sein kann, weiß Java nicht, wie es herausfinden soll, ob jetzt Objekt1 oder Objekt2 eine höhere Wertigkeit besitzt.
Dafür gibt es drei Lösungen...

Weiter im nächsten Post.