Hej, Tyvärr är vb dåligt lämpat för den här typen av uppgifter, många språk har vettiga strukturer för detta native, och jag är osäker på om Collection löser detta snyggt. Roade mig med att lösa ditt problem med denna gammaldags Stright Forward lösning som funkar. Lite trixigare variant med generics (lite fånigt mellansteg men ids inte fixa): Fast det här är vb6, inte vb.net. Hade det varit i vb.net hade jag använt någon typ av hashtabell ("HashMap" heter det väl?), som gör det hundra gånger snyggare och enklare. Har ändrat min kod ovan. På raden Det snyggaste hade ju varit i språk som stöder olika typer av maps, här C++:Sökmotor i VB
Jag skulle behöva hjälp med följande:
Jag vill ha en funktion som ger ut en array innehållande ord i den ordning de förekommer i en text sträng, exempel:
Textsträng: "hej jag behöver hjälp med hjälp nu jag jag jag"
Array tillbaka: "jag:4, hjälp:2, hej:1, behöver:1, med:1, nu:1"
<CODE>
Public Function GetWordList(ByVal inText as String) as Variant
' Hur fan gör jag här!?!? ;-)
End Function
</CODE>Sv: Sökmotor i VB
Antingen kör du med en Array(Array()), men det är inte så snyggt. Jag skulle föredra att göra en egen datatyp här:
<code>
Public Type SearchResult
text As String
count As Long
End Type
</code>
Sen något i stil med (pseudo, du får fixa detaljerna själv):
<code>
Public Function GetWordList(ByVal inText as String) as Variant
dim results() as SearchResult
a = Split(inText, " ")
for each str in a
if str in results
sr(str).count = sr(str).count +1
else
sr.add(str, 1)
end if
next
End Function
</code>
Det är lite trix med Redim etc., alternativt köra med arrayer, alternativt kolla på Collections.Sv:Sökmotor i VB
Vill du ha det sorterat på ett speciellt sätt så återkom. Testa denna lösning mot en ListBox.
<code>
Option Explicit
Private Sub Command1_Click()
Dim retArray() As String, i As Long
retArray = Split(GetWordList("LCase(hej jag behöver hjälp med hjälp nu jag jag jag")), ",")
'***************************************************************************************************
For i = 0 To UBound(retArray) -1 ' Har gjort denna Listbox för att du skall kunna
List1.AddItem retArray(i) ' kolla att Functionen gör rätt.
Next i ' Listboxen simulerar din GetWordList ut Variant Array
End Sub ' Du får sortera arrayen efter behov
Public Function GetWordList(ByVal inText As String) As String
Dim splitTxt() As String
Dim i As Long, j As Long, wCount As Long
Dim wTest As String, retStr As String
splitTxt = Split(inText, " ")
For i = 0 To UBound(splitTxt)
wCount = 0
wTest = splitTxt(i)
If wTest <> "" Then
For j = 0 To UBound(splitTxt)
If wTest = splitTxt(j) Then
wCount = wCount + 1
splitTxt(j) = ""
End If
Next 'j
retStr = retStr & wCount & " : " & wTest & "," ' sortera efter antal
End If
Next 'i
GetWordList = retStr
End Function
</code>Sv: Sökmotor i VB
Private Function GetWordList(ByVal inText As String) As System.Collections.Generic.List(Of ordräknare)
Dim d As New System.Collections.Generic.Dictionary(Of String, Integer)
' harva genom listan med ord
For Each ord As String In inText.Split(" ")
If Not d.ContainsKey(ord) Then
d.Add(ord, 0)
End If
d(ord) += 1
Next
' skapa lista med ordräknare-objekt
Dim l As New System.Collections.Generic.List(Of ordräknare)
' skapa ordräknare-objekt för varje funnet ord och dess antal förekomster
For Each kv As System.Collections.Generic.KeyValuePair(Of String, Integer) In d
Dim o As New ordräknare
o.antal = kv.Value
o.text = kv.Key
' lägg det nya objektet i listan
l.Add(o)
Next
' sortera listan och returnera den
l.Sort(New ordräknareComparer())
Return l
End Function
Private Structure ordräknare
Public text As String
Public antal As Integer
End Structure
Private Class ordräknareComparer
Implements IComparer(Of ordräknare)
Public Function Compare(ByVal x As ordräknare, ByVal y As ordräknare) As Integer Implements System.Collections.Generic.IComparer(Of ordräknare).Compare
Return x.antal > y.antal
End Function
End Class
Sv:Sökmotor i VB
Sv:Sökmotor i VB
<b> retArray = Split(GetWordList(LCase("hej jag behöver hjälp med hjälp nu Jag jag jag")), ",")</b>
LCase har tillkommit
Både ("Jag" och "jag") räknas i samma batch blir (4 jag)
Tycker att min lösning är snygg. Vad tycker Ni. ;-)
Förmodligen tycker Ni som tar betalt för antal programrader att det är skit.Sv: Sökmotor i VB
string s = "hej jag behöver hjälp med hjälp nu Jag jag jag", tmp;
stringstream ss(s);
map<string, size_t> occurences;
ss >> tmp;
while(!ss.eof()){
occurences[tmp]++;
ss >> tmp;
}
Ännu snyggare med vettig användning av färdiga STL-style-algoritmer, eller i språk som haskell eller Ruby, där array-hantering är mer naturlig.
Typ (Ruby):
<code>
words = "apa apa gris"
freqs = Hash.new(0)
words.split(" ").each { |word| freqs[word] += 1 }
</code>
freqs innehåller nu hela listan räknad... (prova själv på http://tryruby.hobix.com/).