我将尽可能简单地尝试。 我输入了一个句子,我需要“压缩”句子。
到目前为止我在一个数组中有:“Hello 0”; “我的1”; “名字2”; “是3”; “你好4” 这个词是输入的单词,后面的数字是它的位置。
我需要这样:“Hello 0 4”; “我的1”; “名字2”; “是3”
所以基本上所有相同的单词都放在数组的一个元素中,其位置如上所述。
k = 1
y = 0
For each x in Array
tempArray = x.Split(" ")
tempWord = tempArray(0) 'Takes just word and not position after it
If tempWord = Array(k) Then
newArray(y) = x & Space(1) & tempArray(1) 'tempArray(1) being the position part
y+=1
k+=1
Else
k+=1
End If
Next
这是我试过的一些代码,但无济于事。有帮助吗?谢谢!
答案 0 :(得分:0)
建议:使用Dictionary(Of String, List(of Integer))
。
查看每个单词并检查它是否已经在字典中。如果不是,则使用新的空列表实例将其添加到字典中。在任何情况下,您都应该将该位置添加到字典中该单词的列表中。
完成后,您可以迭代字典的所有KeyValuePairs,并将带有相关位置的键附加到结果字符串。
如果订单很重要(例如,如果“Hello 0 4”必须首先出现,因为它仍然是遇到的第一个单词),您可以在单独的列表中记下订单,只要您在字典中添加新单词或者使用System.Collections.Specialized.OrderedDictionary
,但需要注意的是它不是通用集合,你必须自己处理类型转换。
答案 1 :(得分:0)
Module Module1
Sub Main()
Dim input = {"Hello 0", "my 1", "name 2", "is 3", "Hello 4"}
Dim output As New Dictionary(Of String, String)
For Each current In input
' split current input
Dim currentSplited = current.Split(" ")
Dim word = currentSplited(0)
Dim trailingNumbers = currentSplited(1)
' if it already exists
If output.ContainsKey(word) Then
' add trailing numbers
output(word) = output(word) & " " & trailingNumbers
Else
' new input
output.Add(word, trailingNumbers)
End If
Next
' create new array from dictionary
Dim newArray = output.Select(Function(x) x.Key & " " & x.Value).ToArray()
' print each value in new array
For Each current In newArray
Console.WriteLine(current)
Next
Console.Write("Press any key . . . ")
Console.ReadKey(True)
End Sub
End Module
答案 2 :(得分:0)
以下是使用Linq的答案,它基本上与其他已经指出的相同:
将文本及其组索引加入一个字符串。
' Replace interpolation ($"...") by String.Format if not available
Dim output = Aggregate indexedWord In sentence
Let parts = indexedWord.Split(" "c)
Group parts(1) By word = parts(0) Into indexes = Group
Select $"{word} {String.Join(" ", indexes)}"
Into ToArray
答案 3 :(得分:0)
这是另一个效率低下的LINQ解决方案:
Dim myArray = {"Hello 0", "my 1", "name 2", "is 3", "Hello 4"}
Dim grouped = myArray.GroupBy(Function(s) Split(s,, 2)(0), Function(s) Split(s,, 2)(1))
Dim newArray = grouped.Select(Function(g) g.Key & " " & Join(g.ToArray)).ToArray
或句子:
Dim words = "Hello my name is Hello".Split
Dim newArray = Enumerable.Range(0, words.Length).GroupBy(Function(i) words(i),
Function(i) i & "").Select(Function(g) g.Key & " " & Join(g.ToArray)).ToArray
Split(s,, 2)
按第一个空格拆分字符串,并将结果限制为2个项目。如果字符串总是只有一个空格,那么Split(s)
就足够了
我使用的.GroupBy
LINQ扩展的第一个参数选择要分组的值,第二个参数选择每个组的项目。例如:
{1,2,2}.GroupBy(Function(i) i)
会产生这样的集合:
.Key items
1 {1}
2 {2,2}
.Select
LINQ扩展名用于将每个组转换为字符串。例如,包含.Key
"Hello"
和iems {"0","4"}
的群组将为"Hello" & " " & Join({"0","4"})
,并生成"Hello 0 4"
。
.ToArray
用于获取IEnumerable
结果并将其存储在数组中。为了更好地理解,我建议搜索“linq VB”并尝试一些示例。