2017-09-21 1 views
2

이 프로그램을 사용하여 높은 점수의 게임을 정렬 한 다음 Using LISTS라는 사용자 이름으로 가장 큰 점수를 표시합니다. 지금까지 내가 쓴 :VB에서 정수 내림차순으로 정수 및 문자열 목록 정렬

Public highscore As New List(Of HighScores) 

highscore.Add(New HighScores("Jeremias", 6)) 
highscore.Add(New HighScores("Tom", 1)) 
highscore.Add(New HighScores("sdf", 5)) 
highscore.Add(New HighScores("asfd", 1)) 

highscore.Sort() 
highscore.Reverse() 

Console.WriteLine("------High Scores-----") 
For Each scores In highscore 
    Console.WriteLine(scores) 
Next 
Console.WriteLine("----------------------") 

그리고 최고 기록 등급 :

Public Class HighScores 
    Public name As String 
    Public score As Integer 

    Public Sub New(ByVal name As String, ByVal score As Integer) 
     Me.name = name 
     Me.score = score 
    End Sub 

    Public Overrides Function ToString() As String 
     Return String.Format("{0}, {1}", Me.name, Me.score) 
    End Function 
End Class 

보통 난 그냥 목록을 정렬 할 .Sort()와 .Reverse()를 사용하는 것이지만,이 경우 내가 돈 내가이 일을 할 수 있다고 생각하지 않아. 모든 아이디어를 어떻게이/그냥 목록을 쉽게 다시 작성할 수 있습니다?

답변

3

다양한 방법으로 List(Of T)을 정렬하는 방법을 지정할 수 있습니다. 가장 간단한 정도로 같을 것이다 :

Comparison(Of T) 대리자를 취하고 그 대리자하는 람다 식을 사용 Sort의 과부하를 사용
highscore.Sort(Function(x, y) y.score.CompareTo(x.score)) 

. 람다 매개 변수는 xy이고 몸체는 scoreyCompareTo을 호출합니다. 이는 정렬이 내림차순으로 발생하고 Reverse에 전화 할 필요가 없기 때문에 중요합니다.

람다 대신 명명 된 메서드를 사용할 수 있습니다. 이러한 방법은 다음과 같을 것이다 :

Private Function CompareHighScoresByScoreDescending(x As HighScores, y As HighScores) As Integer 
    Return y.score.CompareTo(x.score) 
End Function 

코드를 다음과 같을 것이다 정렬 :

highscore.Sort(AddressOf CompareHighScoresByScoreDescending) 

정렬을 위해 개체를 비교, 대회가 -1, 0과 1을 사용하는 것입니다 상대 위치를 나타냅니다. 이것이 바로 CompareTo이하는 일입니다. 따라서 우리의 비교 방법이 여기에 있습니다. CompareTo을 호출 한 객체가 개념적으로 더 적은 객체 인 경우 전달하는 객체의 결과는 -1입니다. 1은 첫 번째 객체가 두 번째 객체보다 크다는 것을 의미하고 0은 두 객체가 동일 함을 의미합니다. 그 방법과 같이 다시 작성할 수 있습니다 :

Private Function CompareHighScoresByScoreDescending(x As HighScores, y As HighScores) As Integer 
    If y.score < x.score Then 
     Return -1 
    ElseIf y.score > x.score Then 
     Return 1 
    Else 
     Return 0 
    End If 
End Function 

그것은 비록 Integer 유형, 즉 그 CompareTo 방법의 기존 IComparable 구현을 사용하는 것이 분명히 더 간결합니다.

그런데 코드가 다른 영역에서 몇 가지 개선점을 사용할 수 있습니다. 첫째, HighScores은 해당 클래스에 적절한 이름이 아닙니다. 그것은 하나의 일을 나타내며 이름은 복수형이 아니어야하며 실제로는 그 자체로 높은 점수를 나타내지 않습니다. 더 적절한 이름은 PlayerScore 일 것이므로 그 이름이 나타내는 내용을보다 정확하게 설명합니다.

둘째, List 변수는 실제로 여러 항목을 포함하는 목록 (예 : 복수 항목을 포함하는 목록)을 나타냅니다. 따라서 이름은 복수형이어야합니다. 실제로는 높은 점수를 나타내므로 highScores으로 지정해야합니다.

마지막으로 멤버 변수를 공개적으로 노출하는 것은 거의 보편적으로 나쁜 습관입니다. 해당 클래스의 속성을 반드시 사용해야합니다.

보너스로 VS 2015 이상을 사용하는 경우 String.Format을 문자열 보간으로 바꿀 수도 있습니다.

Public Class PlayerScore 

    Public Property Name As String 
    Public Property Score As Integer 

    Public Sub New(name As String, score As Integer) 
     Me.Name = name 
     Me.Score = score 
    End Sub 

    Public Overrides Function ToString() As String 
     Return $"{Name}, {Score}" 
    End Function 

End Class 
+0

감사합니다. –