我正在学习在学校排序算法,我们应该对所有字符进行排序,然后实现单词排序。
我使用了一个Char()数组,我得到了单词排序来处理String()数组。现在我想将两者结合成一个函数:
For j = 0 To arr.Length
For i = 0 To hi
If arr(i) > arr(i + 1) Then
Swap(arr, i, i + 1)
End If
Next
hi -= 1
Next
我怎样才能使arr可以是Char()和String()?
我试过了:
If bolWords Then
Dim arr As String()
Else
Dim arr As Char()
End If
但是由于范围的原因,它表示它未被宣布。我也试过Object(),但是当我做ToCharArray()时,它说引用类型有问题。
我可以使用Char()数组来排序单词吗?
答案 0 :(得分:1)
您可以简单地使用Array类型作为参数,并可以将您的数组发送到更通用的方法。
在方法中,我检查项是否实现了IComparable,如果是,则使用IComparable实现。如果没有,只需使用<>算法
show方法然后还显示数组:
Sub Sort(ByRef items As Array)
For i As Integer = LBound(items) To UBound(items)
For j = i + 1 To UBound(items)
If (items(i).GetType() Is GetType(IComparable) AndAlso items(i).CompareTo(items(j)) > 0) OrElse items(i) > items(j) Then
Dim copy = items(j)
items(j) = items(i)
items(i) = copy
End If
Next
Next
End Sub
Sub Show(strTitle As String, items As Array)
Console.WriteLine(strTitle + vbCrLf + New String("-", strTitle.Length))
For Each item In items
Console.WriteLine("{0}", item)
Next
End Sub
Sub Main()
Dim strArray() As String = {"Test", "Abc", "Copy", "Sorter", "Bubble"}
Dim chrArray() As Char = {"a", "b", "q", "m", "j", "z", "c", "0"}
Dim intArray() As Integer = {5, 3, 7, 9, 10, 5464, 4, 1, 3, 3}
Sort(strArray)
Sort(chrArray)
Sort(intArray)
Show("Sorted strings", strArray)
Show("Sorted chars", chrArray)
Show("Sorted ints", intArray)
Console.ReadLine()
End Sub
答案 1 :(得分:1)
你可以用泛型和lambda这样做:
Sub SortArray(Of T)(arr As T(), isGreater As Func(Of T, T, Boolean))
For j = 0 To arr.Length
For i = 0 To arr.Length - 2
If isGreater(arr(i), arr(i + 1)) Then
Dim tmp = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = tmp
End If
Next
Next
End Sub
然后你可以这样称呼它:
Dim xs = { "D", "B", "C", "E", "F", "A" }
SortArray(xs, Function (x1, x2) x1 > x2)
使用这种方法,您可以对任何类型的数组进行排序。
答案 2 :(得分:0)
这是一个单行:
Public Function Sort(Of T)(ByVal Items As IEnumerable(Of T)) As IEnumerable(Of T)
Return Items.OrderBy(Function(i) i)
End Function
然后你就这样称呼它:
Dim arr() As String = { ... } ' could be a string or a character array
arr = Sort(arr).ToArray()
但是,由于这里的真正目标是了解泛型和基本排序算法,我可以指出您需要对现有代码执行的一些操作:
首先是这一行:
If arr(i) > arr(i + 1) Then
问题是>
比较。对于任何两种随机类型,您无法确定>
运算符是否已定义。相反,你需要这样写:
If arr(i).CompareTo(arr(i + 1)) > 0 Then
此外,对于这项工作,您需要声明您的排序方法,以便将其约束到IComparable接口,如下所示:
Public Sub Sort(Of T As IComparable)(ByVal arr() As T)
如果您这样做,那么原始代码的其余部分应该无需进一步更改即可运行。