KAEPS133
Freizeitschrauber(in)
Hi,
Ich habe eine Frage zu Java bzw. zum schreiben von generischem Code.
Die Aufgabe ist Folgende:
Ich habe also zuerst den CountingSort Algorithmus geschrieben, wie ich bis jetzt immer Code geschrieben habe.
Das Funktioniert auch wunderbar. Beim Versuch einen generischen Code zu bauen scheitere ich dann aber. Lied wohl daran das ich es noch nicht 100% Verstanden habe.
Hier ist mal mein generischer Versuch. Wenn mir da jemand bei helfen könnte und das vll auch nochmal für dumme Erklärt, wäre ich unendlich dankbar!
Ich habe die meisten Probleme lösen können indem ich alles zu (Integer) caste, aber ich glaube das das nicht der Sinn von generischem Code sein soll.
Ich habe eine Frage zu Java bzw. zum schreiben von generischem Code.
Die Aufgabe ist Folgende:
Geben Sie eine Implementierung (des ComparisonCountingSort) als statische generische Methode in Java an. Ihre Funktion soll Arrays
mit beliebigen, aber vergleichbaren Elementen sortieren.
Ich habe also zuerst den CountingSort Algorithmus geschrieben, wie ich bis jetzt immer Code geschrieben habe.
Code:
public class ComparisonCountingSort
{
public static void main(String[] args)
{
Integer [] arrayToSort = {9, 6, 6, 3, 2, 0, 4, 2, 9, 3};
System.out.println(Arrays.toString(countingSort(arrayToSort)));
}
public static int[] countingSort(Integer[] arrayToSort)
{
int[] aux = new int[arrayToSort.length];
// find the smallest and the largest value
int min = arrayToSort[0];
int max = arrayToSort[0];
for (int i = 1; i < arrayToSort.length; i++)
{
if (arrayToSort[i] < min) min = arrayToSort[i];
else if (arrayToSort[i] > max) max = arrayToSort[i];
}
int[] counts = new int[max - min + 1];
for (int i = 0; i < arrayToSort.length; i++)
{
counts[arrayToSort[i] - min]++;
}
counts[0]--;
for (int i = 1; i < counts.length; i++)
{
counts[i] = counts[i] + counts[i-1];
}
for (int i = arrayToSort.length - 1; i >= 0; i--)
{
aux[counts[arrayToSort[i] - min]--] = arrayToSort[i];
}
return aux;
}
}
Das Funktioniert auch wunderbar. Beim Versuch einen generischen Code zu bauen scheitere ich dann aber. Lied wohl daran das ich es noch nicht 100% Verstanden habe.
Hier ist mal mein generischer Versuch. Wenn mir da jemand bei helfen könnte und das vll auch nochmal für dumme Erklärt, wäre ich unendlich dankbar!
Code:
public class ComparisonCountingSortGeneric
{
public static void main(String[] args)
{
Integer [] arrayToSort = {9, 6, 6, 3, 2, 0, 4, 2, 9, 3};
//String result = Arrays.toString(countingSort(arrayToSort));
//System.out.println(result);
}
public static <T extends Comparable <T>> int[] countingSort (T[] arrayToSort , integerComperator c)
{
int[] aux = new int[arrayToSort.length];
T min = arrayToSort[0];
T max = arrayToSort[0];
for (int i = 1; i < arrayToSort.length; i++)
{
if (c.compare(arrayToSort[i], min) < 0) min = arrayToSort[i];
else if (c.compare(arrayToSort[i], max) > 0) max = arrayToSort[i];
}
int[] counts = new int[max - min + 1];
for (int i = 0; i < arrayToSort.length; i++)
{
counts[arrayToSort[i] - min]++;
}
counts[0]--;
for (int i = 1; i < counts.length; i++)
{
counts[i] = counts[i] + counts[i-1];
}
for (int i = arrayToSort.length - 1; i >= 0; i--)
{
aux[counts[arrayToSort[i] - min]--] = arrayToSort[i];
}
return aux;
}
public static class integerComperator<T> implements Comparator < T >
{
@Override
public int compare ( Integer o1 , Integer o2 )
{
if (o1 < o2) return -1;
else if (o1 > o2) return 1;
return 0;
}
}
}
Ich habe die meisten Probleme lösen können indem ich alles zu (Integer) caste, aber ich glaube das das nicht der Sinn von generischem Code sein soll.