problem z sortowanie arraylist

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.

2

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));
0

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

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();
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.

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