[ 7e7 @ 25.02.2013. 09:31 ] @
Pozdrav svima,

imam problem sa prikazivanjem rezultata nekog glasanja u text box-u zeljenim redoslijedom.

Naime, imam jedan niz tipa string koji se zove privRez() i njegov sadrzaj izgleda npr. ovako:

0 bodova ima ucesnik broj 1
0 bodova ima ucesnik broj 2
5 bodova ima ucesnik broj 3
20 bodova ima ucesnik broj 4
12 bodova ima ucesnik broj 5
10 bodova ima ucesnik broj 6


Nakon toga dolazi dio koda koji elemente tog niza ispisuje u jedan text box odakle ga korisnik moze kopirati.

Ja zelim da mi rezultati u text box-u budu sortirani prema prvoj koloni (tj. prema broju bodova) od najveceg ka najmanjem.

Kad pozovem Array.Sort() metodu na ovaj niz, ona ga sortira prema alfabetu. Poslije toga dodam Array.Reverse() (cisto da bi mi najveci broj bodova bio na vrhu), i to izgleda ovako:

10 bodova ima ucesnik broj 6
12 bodova ima ucesnik broj 5
20 bodova ima ucesnik broj 4
5 bodova ima ucesnik broj 3
0 bodova ima ucesnik broj 1
0 bodova ima ucesnik broj 2

Kao sto se vidi, niz je sortiran prema alfabetu, a ne prema broju bodova. Sort metoda tretira ga kao string jer i jeste niz tipa string.

Moze li me neko savjetovati kako da sortiram niz tako da prvu kolonu tretira kao integer vrijednosti (da sortirane vrijednosti budu 20, 12, 10, 5, 0, 0)?

Hvala!


[ djoka_l @ 25.02.2013. 09:42 ] @
Generalno, problem nestandardnog sortiranja se u svakom jeziku rešava tako što se za sortiranje napiše funkcija koja poredi dva elementa i koja daje rezultat manji od 0 ako je prvi element "manji" od drugog, nula ako su "jednaki" i rezultat veći od nule ako je prvi element "veći" od drugog. Tada se rutini za sortiranje daje pokazivač na funkciju koja vrši poređenje kao jedan od argumenata.

Ovde imaš objašnjenje i primer za VB:
http://msdn.microsoft.com/en-us/library/aa311216(v=vs.71).aspx
[ Shadowed @ 25.02.2013. 10:41 ] @
Napravis klasu otprilike ovako:

Code:

public class Result
{
    public int PlayerNumber;
    public int Points;

    public string ToString()
    {
        return Points.ToString() + " bodova ima ucesnik broj " + PlayerNumber.ToString();
    }
}


I onda koristis niz Result-a i sortiras sa: Results.OrderBy(r => r.Points).
[ 7e7 @ 27.02.2013. 10:40 ] @
Citat:
djoka_l: Generalno, problem nestandardnog sortiranja se u svakom jeziku rešava tako što se za sortiranje napiše funkcija koja poredi dva elementa i koja daje rezultat manji od 0 ako je prvi element "manji" od drugog, nula ako su "jednaki" i rezultat veći od nule ako je prvi element "veći" od drugog. Tada se rutini za sortiranje daje pokazivač na funkciju koja vrši poređenje kao jedan od argumenata.

Ovde imaš objašnjenje i primer za VB:
http://msdn.microsoft.com/en-us/library/aa311216(v=vs.71).aspx


Hvala. Shvatio sam da se to tako radi, skontao sam da sort metoda ima 16 tih tzv. overload-a i citao sam sve te msdn clanke ali nisam to uspio shvatiti, pa sam zato pitao vas ovdje.


@ Shadowed:

Hvala, pokusacu iskoristiti tu OrderBy() metodu.
[ 7e7 @ 27.02.2013. 20:05 ] @
Hvala vam jos jednom, uspio sam napraviti sta sam htio koristeci OrderByDescending() metodu. Evo stavicu ovdje kod, mozda nekome bude koristilo:

Pojasnjenje: rezultati su sadrzani u intFot nizu koji ima 1 vise element nego sto ima ucesnika (nisam htio da koristim prvi element indeksa 0). Onaj niz privRez koji sam spominjao u prvom postu je izbacen iz upotrebe. Niz ucesnici ima elemenata tacno koliko ima ucesnika.

Code:

        Structure Ucesnik
              Public Broj As String
              Public Bodovi As Integer
        End Structure


        'ocisti textbox
        tbxRezultati.Clear()

        'napravi niz Ucesnik objekata
        Dim ucesnici (UnosPodatakaForm.intBrojFot - 1) As Ucesnik
        For i = 0 To UnosPodatakaForm.intBrojFot - 1
            ucesnici(i) = New Ucesnik With {.Broj = i + 1 , .Bodovi = MainForm.intFot(i + 1)}
        Next i

        'sortiraj po bodovima
        Dim query As IEnumerable(Of Ucesnik) = _
            ucesnici.OrderByDescending(Function(Ucesnik) Ucesnik.Bodovi)

        'ispisi rezultate u text box
        For Each uces As Ucesnik In query
            tbxRezultati.Text = tbxRezultati.Text & vbCrLf & uces.Bodovi & " bodova ima ucesnik broj " & uces.Broj
        Next uces