problem z sortowanie arraylist

Odpowiedz Nowy wątek
2011-08-17 16:26
marek
0

Witam,mam problem taki oto podstawowym zadaniem : "[...]Ma być: nazwa gatunku, nazwa browaru, rok załozenia browaru i procent ekstraktu chmielowego. Niech program umożliwia wprowadzenie z klawiatury danych pieciu gatunków piwa, posortuje od najmniejszej do największej zawartości chmielu[...]"

Prosiłbym o kilka porad jak sobie tym poradzić,nie wiem nawet jak zacząć ;/ mogłbym zrobić 2x arraylist w pierszej wszystke gatunki ,nazwy itp. a w drugiej tylko zawartość % chmielu,tylko jeżeli posortuje sobie tabele z chmielem to będę miał pomieszane wszystko.Chyba ,że da się jednocześnie przemieścić nz.browaru w tabeli 1 na miejsce X,i procent który do niego należy w drugiej tabeli na to samo miejsce tylko nie wiem jak to zrobić...
Pozdr.

Pozostało 580 znaków

2011-08-17 17:17
msm
1

Zacznijmy od tego że nie wiem z jakiej książki/tutoriala się uczysz, ale wywal ją/go. ArrayList jest przestarzała już od bardzo dawna. Ale ok, nieważne.

Najpierw szkielet implementacji:

class Element
{
    public Element(string nazwa, int rok, float zawartosc)
    {
        this.Nazwa = nazwa;
        this.RokZalozania = rok;
 
        if (zawartosc < 0 || zawartosc > 1)
        {throw new ArgumentException("Zawartość ma zawierać się od 0 (0%) do 1 (100%)");}
        this.ZawartoscChmielu = zawartosc;
    }
 
    public string Nazwa { get; set; }
    public int RokZalozania { get; set; }
    // ...
    public float ZawartoscChmielu { get; set; }
}
 
class Program
{
    static void Display(Element[] elements)
    {
        int ndx = 0;
        foreach (var el in elements)
        {
            Console.WriteLine(ndx.ToString() + ": " + 
                el.Nazwa + " " + 
                el.RokZalozania + " " + 
                el.ZawartoscChmielu);
            ndx++;
        }
    }
 
    static void Main(string[] args)
    {
        ArrayList al = new ArrayList();
        al.Add(new Element("asdf", 1999, 0.05f));
        al.Add(new Element("foo", 1992, 0.03f));
        al.Add(new Element("asdf", 1845, 0.07f));
 
        Element[] els = (Element[])al.ToArray(typeof(Element));
        Display(els);
 
        Console.ReadKey(true);
    }
}

I teraz sposoby żeby to posortować:

I. za pomocą IComparable -
zmieniamy klasę element w taki sposób:

class Element : IComparable // !!!
{
    // to samo...
 
    public int CompareTo(object obj)
    {
        return this.ZawartoscChmielu.CompareTo(((Element)obj).ZawartoscChmielu);
    }
}

i dodajemy

al.Sort();

w miejscu gdzie lista ma być sortowana (najlepiej tuż po stworzeniu).

II: IComparer:

class ElementByChmielComparer : IComparer // Z nazwy wyszło spagetti bo wymieszałem polski z angielskim. nvm.
{
    public int Compare(object x, object y)
    {
        return ((Element)x).ZawartoscChmielu.CompareTo(((Element)y).ZawartoscChmielu);
    }
}

i dodajemy

al.Sort(new ElementByChmielComparer());

po stworzeniu listy.

// -----

Gdybyś zamiast prehistorycznej ArrayListy używał List<element> To wystarczyłoby wywołać (bez żadnych modyfikacji niczego):

al.Sort((x, y) => x.ZawartoscChmielu.CompareTo(y.ZawartoscChmielu));
edytowany 1x, ostatnio: msm, 2011-08-17 17:18
Dżizys. On jest na poziomie tablic, a Ty tu z klasami, interfejsami, delegatami i wyrażeniem lambda wyskakujesz :P - Sarrus 2011-08-17 20:13
A tam - chciałem naprawdę zaszaleć i zrobić ogólnego IComparera za pomocą refleksji ;). - msm 2011-08-17 20:36

Pozostało 580 znaków

2011-08-17 18:04
marek
0

Trochę to skomplikowane ale i tak dzięki za odpoweidź ;)

Pozostało 580 znaków

2011-08-17 19:12
0

Lub jak byś zamiast ArrayList chciał używać list:

 
List<Element> al = new List<Element>();
al.Add(new Element("Lech", 1920, 0.06F));
al.Add(new Element("Warka", 1920, 0.08F));
al.Add(new Element("Tyskie", 1920, 0.1F));
al = al.OrderByDescending(p => p.ZawartoscChmielu).ToList();
foreach (Element elem in al)
{
      Console.WriteLine(elem.Nazwa + " " + String.Format("{0:0%}", (elem.ZawartoscChmielu)));
}
Console.ReadKey();

Pozostało 580 znaków

2011-08-17 19:19
1
marek napisał(a)

Trochę to skomplikowane ale i tak dzięki za odpoweidź ;)

Skomplikowany to był Twój pomysł z wieloma ArrayList.
Poczytaj o programowaniu obiektowym.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0