2014-11-25 3 views
0

Я изучаю алгоритмы сортировки в школе, и мы должны сортировать все символы, а затем выполнять сортировку слов.Общий тип массива для char() и string()

Я использовал массив 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 

Как я могу сделать так, что обр может быть как Char() и String()?

Я пробовал:

If bolWords Then 
    Dim arr As String() 
Else 
    Dim arr As Char() 
End If 

Но он говорит, что это необъявленная из-за объема. Я также попытался Object(), но когда я делаю ToCharArray(), он говорит, что что-то не так относительно типа referencetype.

Могу ли я использовать массив Char() для сортировки слов?

+0

Не можете ли вы использовать 'String()' для обоих? Переменная 'String' может содержать символ' Char' – SSS

ответ

1

Вы можете просто использовать тип массива в качестве аргумента и можете отправить свои массивы на несколько более общий метод.

В методе я проверяю, реализует ли объект IComparable, и если это так, используйте реализацию IComparable. Если нет, просто используйте алгоритм <>.

Метод шоу затем показывает также массивы:

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

Вы можете сделать это с обобщениями и лямбда, как так:

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) 

При таком подходе вы можете отсортировать любые типы массивов.

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) 

Если вы это сделаете, оставшаяся часть вашего исходного кода должна работать без дальнейших изменений.

+0

, а Char реализует IComparable? Согласно компилятору, это не – Icepickle

Смежные вопросы