Permutationen in C# eine Generische Lösung gesucht?
static void printArr(int[] a, int n)
{
for (int i = 0; i < n; i++)
Console.Write(a[i] + " ");
Console.WriteLine();
}
static void heapPermutation(int[] a, int size, int n)
{
if (size == 1)
printArr(a, n);
for (int i = 0; i < size; i++) {
heapPermutation(a, size - 1, n);
if (size % 2 == 1) {
int temp = a[0];
a[0] = a[size - 1];
a[size - 1] = temp;
}
else {
int temp = a[i];
a[i] = a[size - 1];
a[size - 1] = temp;
}
}
}
public static void Main()
{
int[] a = { 1, 2, 3 };
heapPermutation(a, a.Length, a.Length);
}
Ich habe den Heap Algorithmus in c# implementiert. Es klappt soweit alles wie es soll aber nun würde ich gerne eine generische Methode schreiben. Ich habe es versucht doch leider klappt es nicht. Meine Idee war die Methode heap Permutation einfach generisch zu gestalten indem ich folgendes mache
„class Bclass {
public void anyMethod<U>(T parmA, U parmB) {
// ...
}“
Leider funktioniert das im Zusammenhang mit dem Array das dort übergeben wird überhaupt nicht. Ich weiß nicht warum...
1 Antwort
Bei deinem Versuch deklarierst du den generischen Typ T gar nicht. An sich brauchst du auch nur einen generischen Parameter.
static void printArr<T>(T[] a, int n)
{
// ...
}
static void heapPermutation<T>(T[] a, int size, int n)
{
// ...
}
Die temp-Variablen bekommen zudem den Datentyp T.
Nein. Du hast doch nur einen Container mit Elementen, die du hin- und herschiebst. Ob die Elemente nun Zeichenketten, Zahlen oder Elefanten entsprechen, ist nicht relevant. Nur die Ausgaben auf der Konsolen können unlesbar werden, wenn der Parameter T einen Datentyp vertritt, der die ToString-Methode nicht für eine menschenlesbare Ausgabe überschreibt.
Und wie erzeuge ich nun die passende liste dafür?
int[] a = { 1, 2, 3 };
Wie mache ich das korrekt? Weil wenn ich die Liste so lasse kommt ein Fehler das a nicht impliziert in int konvertierbar ist
Du hast meine obige Antwort vermutlich nicht vollständig gelesen bzw. nicht alle Änderungen vorgenommen, die ich vorgegeben habe.
Was hast du Schritt für Schritt an deinem obigen Anfangscode geändert?
class Program
{
static void Main(string[] args)
{
int[] a = new int[] { 1, 2, 3 };
heapPermutation (a, a.Length, a.Length);
}
static void heapPermutation<t>(t[] a, int size, int n)
{
// if size becomes 1 then prints the obtained
// permutation
if (size == 1)
printArr(a, n);
for (int i = 0; i < size; i++)
{
heapPermutation(a, size - 1, n);
// if size is odd, swap 0th i.e (first) and
// (size-1)th i.e (last) element
if (size % 2 == 1)
{
int temp = a[0];
a[0] = a[size - 1];
a[size - 1] = temp;
}
// If size is even, swap ith and
// (size-1)th i.e (last) element
else
{
int temp = a[i];
a[i] = a[size - 1];
a[size - 1] = temp;
}
}
}
// Driver code
static void printArr<t>(t[] a, int n)
{
for (int i = 0; i < n; i++)
Console.Write(a[i] + " ");
Console.WriteLine();
}
Ah das habe ich übersehen, Vielen vielen dank!!! Es funktioniert =).
Wenn ich nun aber einen string array Permutieren will ist das auch kein Problem?