【问题标题】:Sort an array based on the sorted order of another array根据另一个数组的排序顺序对数组进行排序
【发布时间】:2015-11-28 09:20:11
【问题描述】:

我有两个这样的数组:

name(0)="jack"
name(1)="nicho"
name(2)="Han"
name(3)="Hugo"

Value(0)="70"
Value(1)="60"
Value(2)="30"
Value(3)="90"

如何根据“值”排序的位置结果对“名称”进行排序

我想要的结果:

Value(0)="90"
Value(1)="70"
Value(2)="60"
Value(3)="30"

name(0)="Hugo"
name(1)="jack"
name(2)="nicho"
name(3)="Han"

【问题讨论】:

  • 你试过了吗?
  • 我将答案更新为 Visual Basic 示例。它创建一个索引数组,根据 value() 对索引数组进行排序(倒序),然后根据现在排序的索引数组对 name() 和 value() 进行重新排序。

标签: .net arrays vb.net sorting


【解决方案1】:

使用Dictionary 比使用两个单独的数组要容易得多

Dim val As New Dictionary(Of String, String)
val.Add("jack", 70)
val.Add("nicho", 60)
val.Add("Han", 30)
val.Add("Hugo", 90)

你可以像下面这样排序

Dim sorted = From item In val Order By item.Value Descending Select item

如果要添加排序到数组

        Dim arrName(), arrValue() As String
        Dim k As Integer = 0
        ReDim Preserve arrName(sorted.Count - 1)
        ReDim Preserve arrValue(sorted.Count - 1)
        For Each it In sorted
            arrName(k) = it.Key
            arrValue(k) = it.Value
            k = k + 1
        Next


你可以这样做

        Dim name() As String = {"jack", "nicho", "Han", "Hugo"}
        Dim value() As String = {"70", "60", "30", "90"}

        Dim j As Integer = 0
        Dim new_value = From val1 In value Order By val1 Descending Select val1
        Dim new_name() As String
        Dim idx As Integer
        ReDim Preserve new_name(new_value.Count - 1)
        For Each itm In new_value
            idx = Array.IndexOf(value, itm)
            new_name(j) = name(idx)
            j = j + 1
        Next

这将创建 2 个新数组 valuename 以及您想要的排序顺序

Demo

【讨论】:

  • 谢谢,它有效!。但是,如何将字典类型转换为数组?
  • 您的字典是 (Of String, String) 但您正在添加一个字符串和一个整数。使用 Option Strict On,这将无法编译。您应该使用这样的代码:val.Add("jack", "70")(注意 70 左右的引号)。
【解决方案2】:

为 value 生成一个索引数组,然后根据 value 对这些索引进行排序。然后根据排序的索引重新排序值和名称。此示例使用带有 lambda 比较的排序。就地重新排序的时间复杂度是线性的 O(n),因为每个数组存储都按其排序顺序放置一个元素。 index() 将恢复为 0 到 length-1。

Module Module1
    Sub Main()
        Dim name() As String = {"jack", "nicho", "han", "hugo"}
        Dim value() As String = {"70", "60", "30", "90"}
        Dim index(name.Length - 1) As Integer
        Dim i, j, k As Integer
        Dim tname, tvalue As String
        'initialize index
        For i = 0 To name.Length - 1
            index(i) = i
        Next
        'reverse sort index according to value (compare y,x)
        Array.Sort(index, Function(x As Object, y As Object) String.Compare(value(y), value(x)))
        'reorder value and name in place using sorted index
        For i = 0 To name.Length - 1
            If i <> index(i) Then
                tvalue = value(i)
                tname = name(i)
                k = i
                j = index(k)
                While i <> j
                    value(k) = value(j)
                    name(k) = name(j)
                    index(k) = k
                    k = j
                    j = index(k)
                End While
                value(k) = tvalue
                name(k) = tname
                index(k) = k
            End If
        Next
        For i = 0 To name.Length - 1
            Console.WriteLine(name(i) + ControlChars.Tab + value(i))
        Next
    End Sub
End Module

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2015-06-08
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多