VB.NET - 在数组中重新排列数据

时间:2016-10-16 19:30:18

标签: arrays vb.net sorting

我将尽可能简单地尝试。 我输入了一个句子,我需要“压缩”句子。

到目前为止我在一个数组中有:“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

这是我试过的一些代码,但无济于事。有帮助吗?谢谢!

4 个答案:

答案 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的答案,它基本上与其他已经指出的相同:

  1. 拆分项目,
  2. 将索引部分按文本部分
  3. 分组
  4. 将文本及其组索引加入一个字符串。

    ' 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”并尝试一些示例。