Avatar billede karryen Nybegynder
03. januar 2006 - 15:58 Der er 37 kommentarer og
1 løsning

Sortering af tal og navnen

Hej,

Jeg har brug for noget hurtig hjælp

Jeg har en .txt fil med 5x skiftevis navn og et tal. Der er vigtigt at navnene og tallene hører sammen.

Jeg har nu brug for en kode der kan sortere disse, så personen med det højeste tal kommer til at stå først etc.

eksempel.


.txt - filen før sorternig
Mark
4
Karl
12
Sander
17
Alexander
2
Martin
85


Efler sortering
Martin
85
Sander
17
Karl
12
Mark
4
Alexander
2
Avatar billede arne_v Ekspert
03. januar 2006 - 16:25 #1
lav en klasse med navn og tal fields+properties som implementerer IComparable på navn
læs ind fra fil i en ArrayList af den klasse
sorter ArrarList
udskriv ArrayList til en ny fil
Avatar billede karryen Nybegynder
03. januar 2006 - 16:27 #2
forstår hvad du mener, men er bange for jeg ikke har erfaring nok til at kunne lave det i praksis.

Ken jeg få dig til at skrive koden for mig?
Avatar billede arne_v Ekspert
03. januar 2006 - 18:38 #3
hvis du ikke kan skrive den kode - hvorforskal du så skrive den kode ?
Avatar billede karryen Nybegynder
03. januar 2006 - 19:45 #4
det er lige noget jeg skal bruge til et lille skoleprojekt. Bruger det selvfølgelig kun hvis jeg forstår det. Skulle helt bruge det imorgen
Avatar billede arne_v Ekspert
03. januar 2006 - 19:46 #5
gå i gang med at lave noget og post her når du kører fast så hjælper vi dig videre
Avatar billede karryen Nybegynder
03. januar 2006 - 19:55 #6
jamen okay, først problem. Hvordan loader jeg 2 informationer ind i et array, så de 'hænger sammen' ?
Avatar billede arne_v Ekspert
03. januar 2006 - 19:57 #7
ved at du laver din egen Person klasse med 2 properties Navn og Tal

så kan du ligge instanser af den klasse ind i en ArrayList
Avatar billede karryen Nybegynder
03. januar 2006 - 19:58 #8
er bange for jeg allerede er lost nu. Altså jeg har arbejdet med egne klasser før, men ikke med properties. Kan du give et kort eksempel?
Avatar billede arne_v Ekspert
03. januar 2006 - 20:04 #9
Public Class Person
        Private _navn As String
        Private _tal As Integer
        Public Sub New()
            MyClass.New("", 0)
        End Sub
        Public Sub New(ByVal navn As String, ByVal tal As Integer)
            _navn = navn
            _tal = tal
        End Sub
        Public Property Navn() As String
            Get
                Return _navn
            End Get
            Set
                _navn = value
            End Set
        End Property
        Public Property Tal() As Integer
            Get
                Return _tal
            End Get
            Set
                _tal = value
            End Set
        End Property
    End Class
Avatar billede karryen Nybegynder
03. januar 2006 - 20:07 #10
kan du give ngoel kore forkalringer til dette?^^
Avatar billede nielle Nybegynder
03. januar 2006 - 20:10 #11
Properties er rigtig gode til mange ting, men jeg synes nu at det er en smule overkill i det konkrete tilfælde. Jeg ville nøjes med:

Public Class Person
    Public navn As String
    Public tal As Integer

    Public Sub New()
        navn = ""
        tal = 0
    End Sub

    Public Sub New(ByVal navn As String, ByVal tal As Integer)
        Me.navn = navn
        Me.tal = tal
    End Sub
End Class
Avatar billede arne_v Ekspert
03. januar 2006 - 20:14 #12
karryen>

hvad er det i den klasse som du ikke forstår ?
Avatar billede arne_v Ekspert
03. januar 2006 - 20:16 #13
nielle>

nu ved jeg ikke på hvilket niveau det programmerings kursus er, men hvis det
er tilpas højt så kunne han godt få et ordentligt hak i tuden for ikke
at have encapsulated de fields
Avatar billede karryen Nybegynder
03. januar 2006 - 20:16 #14
kan slet ikke lige overskue hvad den gør
Avatar billede karryen Nybegynder
03. januar 2006 - 20:19 #15
arh, er måske alligevel lidt med. Men hvad gør jeg så når jeg skal sortere mit array?
Avatar billede arne_v Ekspert
03. januar 2006 - 20:19 #16
det er en klasse med 2 attributter navn og tal
Avatar billede arne_v Ekspert
03. januar 2006 - 20:21 #17
så lader du klassen implementere IComparable (med sortering efter tal - ikke navn
som jeg skrev tidligere) så kan du umiddelbart sortere en ArrayList med
Person instanser
Avatar billede karryen Nybegynder
03. januar 2006 - 20:22 #18
jo, det forstår jeg. Men hvordan skriver jeg det i praksis?
Avatar billede arne_v Ekspert
03. januar 2006 - 20:27 #19
et eksempel med sortering:

Imports System
Imports System.Collections

Public Class MitObjekt
Implements IComparable
    Private _etNummer As Integer
    Private _etNavn As String
    Public Sub New(ByVal etNummer As Integer, ByVal etNavn As String)
        Me._etNummer = etNummer
        Me._etNavn = etNavn
    End Sub
    Public ReadOnly Property EtNummer() As Integer
        Get
            Return _etNummer
        End Get
    End Property
    Public ReadOnly Property EtNavn() As String
        Get
            Return _etNavn
        End Get
    End Property
    Public Function CompareTo(ByVal o As Object) As Integer Implements IComparable.CompareTo
        Dim mo As MitObjekt = CType(o, MitObjekt)
        If _etNummer = mo._etNummer Then
            Return _etNavn.CompareTo(mo._etNavn)
        Else
            Return _etNummer - mo._etNummer
        End If
    End Function
    Public Overloads Overrides Function ToString() As String
        Return (_etNummer & " " & _etNavn)
    End Function
End Class

Class MainClass
    Public Shared Sub Main(ByVal args As String())
        Dim list As ArrayList = New ArrayList
        list.Add(New MitObjekt(3, "TRE"))
        list.Add(New MitObjekt(2, "TO-A"))
        list.Add(New MitObjekt(2, "TO-C"))
        list.Add(New MitObjekt(2, "TO-B"))
        list.Add(New MitObjekt(1, "ET"))
        Console.WriteLine("Før sortering:")
        Dim i As Integer
        For i = 0 To list.Count - 1
            Console.WriteLine(list(i))
        Next
        list.Sort
        Console.WriteLine("Efter sortering:")
        For i = 0 To list.Count - 1
            Console.WriteLine(list(i))
        Next
    End Sub
End Class
Avatar billede karryen Nybegynder
03. januar 2006 - 20:29 #20
okay, tror jeg er med nu. Prøver lige at koge lidt over det, så vender jeg tilbage imorgen med evt. problemer, eller er det er jo bare at få afleveret nogle point.

Mange tak forhjælpen indtil videre
Avatar billede karryen Nybegynder
04. januar 2006 - 09:42 #21
hvad gør jeg så nu, når jeg skal have informationerne ud en af gangen? Altså først skal jeg skrive en linje med navnet, og derefter en lnije med tallet
Avatar billede nielle Nybegynder
04. januar 2006 - 17:23 #22
list.Sort
Console.WriteLine("Efter sortering:")
For i = 0 To list.Count - 1
    Console.WriteLine(list(i).EtNavn)
    Console.WriteLine(list(i).EtNummer)
Next
Avatar billede arne_v Ekspert
04. januar 2006 - 17:28 #23
eller en ToString metode
Avatar billede karryen Nybegynder
04. januar 2006 - 17:36 #24
jeg kan ikke for lov til at skrive .EtNavn eller .EtNummer bagefter
Avatar billede arne_v Ekspert
04. januar 2006 - 17:50 #25
Du skal nok lige caste

For i = 0 To list.Count - 1
    Console.WriteLine(CType(list(i),Person).EtNavn)
    Console.WriteLine(CType(list(i),Person).EtNummer)
Next
Avatar billede karryen Nybegynder
04. januar 2006 - 17:57 #26
kan ikke få lov til at skrive ,Person
Avatar billede karryen Nybegynder
04. januar 2006 - 18:29 #27
ikke for hvertken at stresse jer, eller kræve noget, men det er lidt vigtigt det kommer til at virke inden imorgen
Avatar billede arne_v Ekspert
04. januar 2006 - 18:34 #28
Console.WriteLine(CType(list(i), MitObjekt).EtNummer & " " & CType(list(i), MitObjekt).EtNavn)

virker fint i mit 03/01-2006 20:27:10 eksempel
Avatar billede arne_v Ekspert
04. januar 2006 - 18:35 #29
og vi har ikke stress på
Avatar billede nielle Nybegynder
04. januar 2006 - 18:44 #30
Nej ingen stres :^)

Det kan som sagt også gøres med en lille ændring til ToString():

Public Overloads Overrides Function ToString() As String
    Return (_etNummer & " " & vbCrLf & _etNavn)
End Function
Avatar billede nielle Nybegynder
04. januar 2006 - 18:44 #31
Public Overloads Overrides Function ToString() As String
    Return (_etNummer & vbCrLf & _etNavn)
End Function
Avatar billede karryen Nybegynder
04. januar 2006 - 18:53 #32
jeg skal ændre det her i klassen ikke?

Hvad skulle de så ændre?
Avatar billede nielle Nybegynder
04. januar 2006 - 18:56 #33
Hvis du indsætter den kode i stefet for den eksisterende ToString(), kan du efterfølgende blot skrive:

list.Sort
Console.WriteLine("Efter sortering:")
For i = 0 To list.Count - 1
    Console.WriteLine(list(i))
Next

- ganske som tidligere.
Avatar billede karryen Nybegynder
04. januar 2006 - 19:01 #34
arh, jamen nu virker det hele jo. Smid begge et svart så i kan få nogle point, mange tak for hjælpen
Avatar billede nielle Nybegynder
04. januar 2006 - 19:07 #35
Giv du dem bare alle sammen til arne_v. :^)
Avatar billede arne_v Ekspert
04. januar 2006 - 19:22 #36
du har da også arbejdet med her

og et svar fra mig
Avatar billede karryen Nybegynder
04. januar 2006 - 19:24 #37
okay, jamen i hvert fald mange gange tak for hjælpen så.
Avatar billede nielle Nybegynder
04. januar 2006 - 19:28 #38
Jeg er ikke helt sikker på om jeg ikke mere har biddraget til forvirringen ;^)

Anyway, så er jeg et øjeblik ikke i tvivl om hvem der har trukket læsset på denne her. :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester