SamuelDexter Ответов: 2

Как оценить числа до 1-го, 2-го и т. д. В силу чего больше и меньше


Всем привет. Пожалуйста, я пытаюсь оценить числа до 1-го, 2-го и т. д. В силу того, что больше и меньше.

Итак, допустим, у меня есть массив чисел, скажем, от 1 до 24

10
22
33
33
40
50

чего я хочу добиться, так это:

33-ничья
50-1-й
40-2-й
22 - 3-й
10 - 4-й

Что я уже пробовал:

Сначала я попробовал что-то подобное, хотя и знаю, что это явно неправильно. Любая помощь будет очень признательна.

  Dim iGrades() As Integer = {"33", "50", "40", "22", "10"}
     
        For Each item In iGrades

            Try
                Dim Lst As New ListBox

                If item = item Then
                    Lst.Items.Add(item & " - Draw")
                ElseIf item > item Then
                    Lst.Items.Add(item & " - 1st")
                ElseIf item < item Then
                    Lst.Items.Add(item & " - 2nd")
                End If

            Catch ex As Exception
Msgbox(err.description)
            End Try
        Next

Maciej Los

Вы пытаетесь сравнить строки вместо целых чисел!

[no name]

И вы сравниваете струны сами с собой.
А равенство - это = = не=. = это присвоение.

Michael_Davies

ВБ = равенство
C = = - это равенство

[no name]

А, черт! Вы правы. Я виноват, что не обратил внимания.

2 Ответов

Рейтинг:
4

Maciej Los

Кажется, вы очень начинающий...

Как я уже упоминал в комментарии к этому вопросу, нет никакой возможности сравнивать строки так же, как целые числа. Вы должны использовать правильный тип данных[^].

Одним из способов сортировки массива является использование В LINQ[^]. Видеть:

Dim iGrades() As Integer = {10, 33, 40, 50, 22, 33}

Dim result = iGrades _
   .OrderByDescending(Function(x) x) _
   .GroupBy(Function(x) x) _
   .Select(Function(grp, iterator) New With _
       { _
           .Index = iterator + 1, _
           .Values = String.Join(", ", grp.Select(Function(x) x)) _
       }) _
   .ToList()

For Each g  In result
   Console.WriteLine("{0} - {1}", g.Index, g.Values)
Next


Результат:
1 - 50
2 - 40
3 - 33, 33
4 - 22
5 - 10


Просмотр слов о приведенном выше запросе Linq:
.OrderByDescending() - сортировка данных в порядке убывания
GroupBy() - создает группы одинаковых значений
Select() - создает новый набор данных, где iterator используется для получения индекса для каждой группы.

Обратите внимание, что когда вы пытаетесь отсортировать стрины, результат может отличаться. Проверить это:
Dim sGrades() As String = {"10", "33", "40", "50", "22", "33", "11", "1", "111"}

Dim result = sGrades _
   .OrderByDescending(Function(x) x) _
   .GroupBy(Function(x) x) _
   .Select(Function(grp, iterator) New With _
       { _
           .Index = iterator + 1, _
           .Values = String.Join(", ", grp.Select(Function(x) x)) _
       }) _
   .ToList()

For Each g  In result
   Console.WriteLine("{0} - {1}", g.Index, g.Values)
Next


Результат:
1 - 50
2 - 40
3 - 33, 33
4 - 22
5 - 111
6 - 11
7 - 10
8 - 1


Взгляните на выделенные жирным шрифтом и подчеркнутые "цифры"!
Но...

Вы должны начать с основ:
Массивы в Visual Basic[^]
Как отсортировать массив в Visual Basic[^]
Алгоритмы сортировки в VB[^]


SamuelDexter

Прежде всего, я не" очень новичок", я кодирую с vb6. Вот доказательство. http://www.softpedia.com/publisher/SoftReckon-LLC-Samuel-Dexter-Yeboah-Gaisie-59052.html
это оплошность, поверь мне. Я печатаю прямо с мобильного телефона, а не копию моего основного кода проекта. Я знаю, что u должен был назначить целое число моей переменной, так как я работаю с числами. Я даже пытался отредактировать сообщение, но просто не могу найти кнопку редактирования.

Maciej Los

Ладно, я тебе верю.
В правом нижнем углу вашего вопроса Вы найдете Улучшить вопрос виджет.

SamuelDexter

Спасибо чувак. Оцененный

Maciej Los

Всегда пожалуйста.

Спасибо, что приняли мой ответ.
Овации,
Мацей

Maciej Los

Я сделал это. Перейдите по ссылке, которую я вам предоставил.

Рейтинг:
1

OriginalGriff

Во - первых, вы не сравниваете числа-вы сравниваете строки, и порядок сортировки (который определяет, какая строка больше другой) очень отличается.
Для строк сравнение выполняется на основе первого отличного символа между двумя строками, поэтому в итоге вы получаете следующий порядок:

1
10
11
12
...
18
19
2
20
21
...
Вам нужно работать с числами в doer, чтобы получить то, что вы хотите, поэтому ваши оценки не должны быть массивом строк:
Dim Grades() As Integer = {33, 50, 33, 40, 22, 10}

Тогда это довольно тривиально: Сортировать массив-это просто Массив.Метод Сортировки (Массив) (Система)[^] сделает это.
Затем пройдите по отсортированному массиву, обнаруживая дубликаты для ваших "розыгрышей" - это тоже просто, так как после сортировки они все находятся рядом друг с другом! Если это не ничья, добавьте ее в список, чтобы затем перейти к значениям "не ничья".
Тогда это тривиально, чтобы закончить его: значения упорядочены так, чтобы первое было самым высоким значением, и так далее.

Попробуйте-это совсем не сложно!

Но сделай себе одолжение: никогда не глотай исключений! Пустой блок catch просто напрашивается на неприятности, потому что вы понятия не имеете, что произошла ошибка, а тем более то, что это было на самом деле! Сообщайте об ошибках, или записать их, или не поймать их, - проглотить их только делает ваш код более трудным для вас, чтобы получить работу!