Forum: Gesperrte Threads Sortieralgorithmus für Visual Basic .NET o.ä. gesucht


von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Hallo.

Ich habe eine Liste als Array, z.B.

[Arrayposition]. [Wert]
1. 1
2. 3
3. 5
4. 2
5. 4
6. 10
7. 8
8. 9
9. 7
10. 6

Ich habe nun eine Reihe von Definitionen/Bedingungen
6 > 3
4 > 2, 3 und 1
8 > 6 und 7

Wie kann ein Sortieralgorithmus aussehen, der das Array nach diesen 
Definitionen sortiert(aber nicht mehr, so kann 5 durchaus nach der 8 
kommen)?

Und mich auf Widersprüche hinweist.

PS: Zahlen als Wertigkeit, in Wahrheit sind es Wörter. Das heißt also 
bspw.
"Wort1, Wort2 und Wort6 müssen immer vor Wort3 auftauchen" und "Wort8 
muß vor Wort6 auftauchen"
Das kann dann zu

Wort1
Wort2
Wort8
Wort6
Wort3

oder zu

Wort1
Wort8
Wort2
Wort6
Wort3

oder zu

Wort2
Wort8
Wort1
Wort6
Wort3

usw.

führen, nicht aber bspw. zu

Wort2
Wort3
Wort1
Wort6
Wort8

Bei Rückfragen, diese stellen.

: Verschoben durch User
von Loki (Gast)


Lesenswert?

Im Prinzip kannst du einen der gängigen Sortieralgorithmen benutzen. Die 
Vergleichsfunktion muss halt angepasst werden. Ich würde das über ein 
Dictionary lösen. In dem Dictionary würden dann die Definitionen stehen. 
Jede Definition sieht folgendermaßen aus: Zahl1, Zahl2, Relation.
Die Vergleichsfunktion kriegt zwei Zahlen und guckt im Dictionary, 
welche größer ist. Ist kein passender Eintrag vorhanden, wird einfach 
die erste Zahl als größere gewertet.

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Loki schrieb:
> Im Prinzip kannst du einen der gängigen Sortieralgorithmen benutzen. Die
> Vergleichsfunktion muss halt angepasst werden. Ich würde das über ein
> Dictionary lösen. In dem Dictionary würden dann die Definitionen stehen.
> Jede Definition sieht folgendermaßen aus: Zahl1, Zahl2, Relation.
> Die Vergleichsfunktion kriegt zwei Zahlen und guckt im Dictionary,
> welche größer ist. Ist kein passender Eintrag vorhanden, wird einfach
> die erste Zahl als größere gewertet.

Ich verstehe nicht, wie das aussehen kann. Bitte ein simples Beispiel.

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Ich verstehe nicht, wie das aussehen kann. Bitte ein simples Beispiel.

von spess53 (Gast)


Lesenswert?

Hi

Hat Visual Basic keine Listenelemente? Mit Delphi würde ich ein TList 
nehmen. 'Sorted' auf True und fertig.

MfG Spess

von DirectX (Gast)


Lesenswert?

Ich bezieh mich mal auf das "o.ä." im Thread-Titel und geb ein 
Perl-Beispiel:
1
%Reihenfolge=(
2
  Wort1=>4,
3
  Wort2=>2,
4
  Wort3=>3,
5
  Wort4=>1,
6
  Nochwas=>5
7
);
8
@ZuSortieren=qw(
9
  Wort1
10
  Wort2
11
  Wort3
12
  Wort4
13
);
14
@Sortiert=sort { $Reihenfolge{$a} <=> $Reihenfolge{$b} } @ZuSortieren;
15
print join(', ',@Sortiert),"\n";

Sowas in der Art war gesucht, oder?

von Arc N. (arc)


Lesenswert?

Nostrifizius in der Satrapenwirtschaft schrieb:
> Ich verstehe nicht, wie das aussehen kann. Bitte ein simples Beispiel.

Statt eines einzigen Dictionaries würde ich hier eher eine Matrix bzw. 
ein Dictionary aus Dictionaries nehmen (ist die Reihenfolge von Anfang 
an eindeutig, geht's natürlich auch mit nur einem einfachen 
Dictionary/Array/Liste etc.).
1
{ { Wort1 < Wort1?, Wort1 < Wort2?, Wort1 < Wort3,? Wort1 < Wort4? },
2
   { Wort2 < Wort1?, Wort2 < Wort2?, Wort2 < Woer3?, Wort2 < Wort4? },
3
   { Wort3 < ... },
4
   ...
5
}
6
konkret dann bspw.
7
{ { false, true, true, false },
8
   { false, false, true, false },
9
   { true, true, false, false },
10
   { true, false, false, false } }

umgesetzt werden könnte das dann bspw. in C# (sollte sich aber 
problemlos in VB umschreiben lassen) so oder wie von DirectX angedeutet, 
mit einer Sprache, die so etwas besser kann.
1
        var ListToSort = new List<string>() { "Wort1", "Wort2", "Wort3", "Wort4" };
2
        var Matrix = new Dictionary<string, Dictionary<string, bool>>();
3
4
        public int WordComparison(string x, string y) {
5
            Dictionary<string, bool> lu;
6
            bool val;            
7
            if (Matrix.TryGetValue(x, out lu)) {
8
                if (lu.TryGetValue(y, out val)) {                
9
                    ...   
10
                }
11
            }
12
            return ...;
13
        }
14
15
            ListToSort.AddRange(new string[] { "Wort1", "Wort2", "Wort3", "Wort4" });
16
17
            Matrix.Add("Wort1", new Dictionary<string, bool>());
18
            Matrix.Add("Wort2", new Dictionary<string, bool>());
19
            Matrix.Add("Wort3", new Dictionary<string, bool>());
20
            Matrix.Add("Wort4", new Dictionary<string, bool>());
21
            Matrix["Wort1"].Add("Wort1", false);
22
            Matrix["Wort1"].Add("Wort2", true);
23
            Matrix["Wort1"].Add("Wort3", true);
24
            Matrix["Wort1"].Add("Wort4", false);
25
26
            ListToSort.Sort(WordComparison);

Unstimmigkeiten kann man mit passendem Iterieren über die einzelnen 
Dictionaries herausfinden.

spess53 schrieb:
> Hi
>
> Hat Visual Basic keine Listenelemente? Mit Delphi würde ich ein TList
> nehmen. 'Sorted' auf True und fertig.
>
> MfG Spess

Gibt's schon, nur gehe ich davon aus, dass das nicht reicht.

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Ich habe folgendes geschrieben - Bubblesort:

Dim vTemp As String
For j = Inhalt.Count - 1 To 0 Step -1
  For i = 0 To j
    If i < Inhalt.Count - 1 Then
      If Vergleich(Inhalt(i).ToString, Inhalt(i + 1).ToString) Then
        vTemp = Inhalt(i).ToString
        MsgBox("Drin")
        Inhalt(i) = Inhalt(i + 1)
        Inhalt(i + 1) = vTemp
      End If
    End If
  Next i
Next j

Vergleich-Funktion gibt True aus, wenn Inhalt(i) größer ist, also nach 
Inhalt(i + 1) stehen soll.

Leider wird die Fkt so gut wie nie aufgerufen. Inhalt ist ein ArrayList.

Verwende ich stattdessen das Original von 
http://msdn.microsoft.com/de-de/library/bb979305.aspx

Dim vTemp As String
For j = Inhalt.Count - 1 To 0 Step -1
  For i = 0 To j
      If Vergleich(Inhalt(i).ToString, Inhalt(i + 1).ToString) Then
        vTemp = Inhalt(i).ToString
        MsgBox("Drinf")
        Inhalt(i) = Inhalt(i + 1)
        Inhalt(i + 1) = vTemp
      End If
  Next i
Next j

wird angezeigt, daß außerhalb des Index operiert werden würde. Bei 10 
Elementen, 0 -> 9 gibt es bei 9 den Indexfehler.

Warum funktioniert das Original nicht und meine veränderte Fkt wird so 
gut wie nie aufgerufen.

Es kann jetzt leicht sein, daß ich unabsichtlich Informationen 
unterschlage. Bei Verständnisschw. fragen.

von ... (Gast)


Lesenswert?

Wenn man schon fremden Code benutzt sollte man ihn entweder verstehen 
oder wenigstens korrekt abtippen.
Tip: "Inhalt.Count" vs. "UBound(ArrayToSort)"

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

... schrieb:
> Wenn man schon fremden Code benutzt sollte man ihn entweder verstehen
> oder wenigstens korrekt abtippen.
> Tip: "Inhalt.Count" vs. "UBound(ArrayToSort)"

Da liegst du falsch. Warum muß ich dir nicht begründen.

von ... (Gast)


Lesenswert?

Doch mußt Du. Das ist nämlich der Grund dafür:

Nostrifizius in der Satrapenwirtschaft schrieb:
> wird angezeigt, daß außerhalb des Index operiert werden würde. Bei 10
> Elementen, 0 -> 9 gibt es bei 9 den Indexfehler.

Du hast 10 Elemente, versuchst aber auf das 11. zuzugreifen!

von ... (Gast)


Lesenswert?

Oder um es anders rum zu sagen:
Beim Original von MSDN fängt die äußere Schleife beim vorletzten Index 
an, bei Dir beim letzten.

von U.R. Schmitt (Gast)


Lesenswert?

Hmm, versucht da jemand sich wieder die Hausübung machen zu lassen und 
wird sofort unfreundlich wenn man ihn nicht direkt mit der Nase auf 
seine Fehler stösst.
Ist schon interessant, erst erzählt er etwas von Sortieralgorithmen und 
spezifischen Regeln für die Sortierung und präsentiert dann einen 
fehlerhaften Bubblesort...

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

U.R. Schmitt schrieb:
> Hmm, versucht da jemand sich wieder die Hausübung machen zu lassen und
> wird sofort unfreundlich wenn man ihn nicht direkt mit der Nase auf
> seine Fehler stösst.
> Ist schon interessant, erst erzählt er etwas von Sortieralgorithmen und
> spezifischen Regeln für die Sortierung und präsentiert dann einen
> fehlerhaften Bubblesort...

Viel interessanter ist, daß du das Problem gar nicht erst lösen kannst 
aber dennoch schreibst um jeden zu zeigen, daß du es nicht kannst.

von Arc N. (arc)


Lesenswert?

Das Original verwendet UBound und LBound um die Feldgrenzen zu 
bestimmen...(zu spät)
Und warum BubbleSort, wenn ArrayList schon Sort kennt?
http://msdn.microsoft.com/en-us/library/0e743hdt.aspx

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Arc Net schrieb:
> Und warum BubbleSort, wenn ArrayList schon Sort kennt?

Weil die Sort - Funktion sich nicht mit meiner Vergleich(a,b)-Funktion 
verbinden läßt. Nur über irgendwelche Interfaces mit massig 
Fehlermeldungen.

von U.R. Schmitt (Gast)


Lesenswert?

Nostrifizius in der Satrapenwirtschaft schrieb:
> Nur über irgendwelche Interfaces mit massig
> Fehlermeldungen.

ROFL, genau da liegt dein Schlüssel zum Glück. Die Interfaces gibts auch 
ohne Fehlermeldungen.

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

U.R. Schmitt schrieb:
> ROFL, genau da liegt dein Schlüssel zum Glück. Die Interfaces gibts auch
> ohne Fehlermeldungen.

Troll.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

@satrapen bitte etwas mehr Freundlichkeit bitte, schließlich möchtest du 
gerne Hilfe erhalten.

von Nostrifizius in der Satrapenwirtschaft (Gast)


Lesenswert?

Läubi .. schrieb:
> @satrapen bitte etwas mehr Freundlichkeit bitte, schließlich möchtest du
> gerne Hilfe erhalten.

Läubi, willst du nur stänkern oder kannst du auch die Frage beantworten?

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.