vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Strings 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)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel