| |
VB.NET - Ein- und UmsteigerStrings sortieren... | | | Autor: DotNetErbse | Datum: 26.07.17 08:36 |
| Hallo Gemeinde,
vielleicht kann mir da Jemand auf die Sprünge helfen...
wie komme ich zu einem Comparer, der mir z.B. die folgenden Strings (alpha-Sort):
AAA
Block
Block 1
Block 10
Block 10.1
Block 10.1 aa
Block 10.1 ab
Block 10.10
Block 10.2
Block 2
Block 3
CCC 1
CCC 10
CCC 2
...
korrekt sortiert nach:
AAA
Block
Block 1
Block 2
Block 3
Block 10
Block 10.1
Block 10.1 aa
Block 10.1 ab
Block 10.2
Block 10.10
CCC 1
CCC 2
CCC 10
???
Irgendwie muss ich ja die Alphas und die numerics separat sortieren...
Mit freundlichen Gr??en
DotNetErbse
[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)] | |
Re: Strings sortieren... | | | Autor: Manfred X | Datum: 26.07.17 09:31 |
| Hallo!
Zunächst mußt Du eindeutige Sortier-Regeln aufstellen
und Du mußt festlegen, welchen Restriktionen die zu
sortierenden Strings unterliegen.
Dein Beispiel ist uneindeutig.
Einige Hinweise:
Gibt es immer einen Buchstaben-Block, gefolgt von einem Ziffernblock?
Muß der Ziffernblock stets einen gültigen Decimal-Wert ergeben,
wobei erforderlichenfalls der Dezimalpunkt benutzt wird?
Wie wird Groß-/Kleinschreibung verarbeitet? | |
A Very Special Comparer | | | Autor: Manfred X | Datum: 26.07.17 10:04 |
| Vielleicht irgend so etwas ....
Public Class SpecialComparer
Implements IComparer(Of String)
Public Function Compare(x As String, y As String) As Integer _
Implements System.Collections.Generic.IComparer(Of String).Compare
x = x.Replace(".", "")
y = y.Replace(".", "")
Dim xp() As String = x.Split(" "c)
Dim yp() As String = y.Split(" "c)
If xp(0) > yp(0) Then Return 1
If xp(0) < yp(0) Then Return -1
If xp.Length = 1 And yp.Length = 1 Then
Return 0
ElseIf xp.Length = 1 And yp.Length > 1 Then
Return -1
ElseIf xp.Length > 1 And yp.Length = 1 Then
Return 1
End If
Try
If CDec(xp(1)) > CDec(yp(1)) Then Return 1
If CDec(xp(1)) < CDec(yp(1)) Then Return -1
Catch ex As Exception
Throw New ArgumentException("Invalid Sort-Arg / numeric")
End Try
If xp.Length = 2 And yp.Length = 2 Then
Return 0
ElseIf xp.Length = 2 And yp.Length > 2 Then
Return -1
ElseIf xp.Length > 2 And yp.Length = 2 Then
Return 1
End If
Return String.Compare(xp(2), yp(2))
End Function
End Class Anwendung:
Dim str() As String = {"AAA", "Block", "Block 1", "Block 10", "Block 10.1", _
"Block 10.1 aa", "Block 10.1 ab", "Block 10.1", _
"Block 10.2", _
"Block 2", "Block 3", "Block 10.10", "CCC 1", _
"CCC 10", "CCC 2"}
Array.Sort(str, New SpecialComparer)
Beitrag wurde zuletzt am 26.07.17 um 10:27:59 editiert. | |
Re: Strings sortieren... | | | Autor: DotNetErbse | Datum: 26.07.17 12:58 |
| Hallo ManneX,
das Problem ist, dass die einzelnen Werte völlig ohne Regeln daherkommen. Es sind Freitexte als Kategorie, die fleißig gemixt sein dürfen.
Ich brauche daraus einfach eine sortierte Distinct-Liste. Und mit sortiert meine ich eben
"das was wie eine Zahl aussieht, soll auch als Zahl sortiert werden, der Rest als String".
Der Punkt ist nicht als Dezimaltrenner zu sehen, sondern eher als Aufzählungszeichen.
Ich schaue mir Dein Beispiel mal an.
Ansonsten brauche ich vielleicht eine Aufsplittung des Textes in Einzelkomponenten getrennt durch SPACES oder so und dann eine Sortierung jeweils der "Spalten"
Vielen lieben Dank!
Mit freundlichen Gr??en
DotNetErbse
[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)] | |
Re: Strings sortieren... | | | Autor: Manfred X | Datum: 26.07.17 13:46 |
| Ohne Konventionen für die Elemente und dazu passende Sortier-Regeln
kann man keine Sortierung durchführen.
Es muß z.B. vermieden werden, daß es bei Vergleichen zu Inkonsistenzen
in der Beurteilung kommt A > B > C > A
Die von Dir genannten Gesichtspunkte (Punkt als Aufzählungszeichen,
Space als Bereichs-Trennzeichen, Ziffernfolge als Zahl) wird von
meinem Code berücksichtigt.
Distinkt-Liste:
Dim str() As String = _
{"CCC 10", "AAA", "Block 4", "Block 1", "Block 10", "Block 10.1",
"Block", "Block 10.1 ab", "Block 10.1 aa", "Block 10.1", _
"Block 10.2", "Block 2", "Block 3", "Block 10.10", "Block 4", _
"CCC 1", "CCC 10", "CCC 2", "CCC 1"}
Array.Sort(str, New SpecialComparer)
str = (From el As String In str Distinct).ToArray | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|