Hirdetés

Aktív témák

  • pmonitor

    aktív tag

    A "Programozás topic"-ban elég vád ért engem. Ez sarkallt arra, hogy itt reagáljak rá(mivel ott nem tudok - a modi hatalmasabb nálam). Én továbbra is állítom, hogy az itt szereplő kódok jól működnek.
    A moderátor ezt állította:
    kreal egy Point classt. szoval ez szep meg jo, csak koze nincs a Sethez.

    Ezzel egy hibát követett el(de az fatális). Ugyanis van köze a Sethez. Nem is kevés. Csak annyi a lényeg, hogy mivel nem írtam át az Equals() metódust, ezért a referenciákat veszi halmaznak. És természetesen azok egyenlőségét vizsgálja. Tehát nagyon is van köze a Sethez. Ha a Main() metódus elejét a következőkre módosítjuk, akkor ez megvilágítja, amiről eddig írtam:
    MyHashSet<Point> myPt = new MyHashSet<Point>();
    Point pnt = new Point(20, 20);
    Point pnt2 = pnt;
    Point pnt3 = new Point(19, 20);
    Point pnt4 = new Point(21, 20);
    myPt.Add(pnt);
    myPt.Add(pnt2);
    myPt.Add(pnt3);
    myPt.Add(pnt4);

    Ennek a kimenete:
    Count = 3
    20 19 21
    Torlendo X érték: 20


    Count = 2
    19 21
    Utolso elem = 21

    Itt tökéletesen látszik, hogy az elején 4 helyett 3 különböző érték van csak: 20 19 21
    Ez a Point pnt2 = pnt; sor miatt van. Mivel ennek a kettőnek azonos a referenciája, ezért a kettőjük helyett csak az egyikük szerepel.

    De ha a Point osztálytba beletesszük az Equals() metódust, akkor így néz ki:
    public override bool Equals(object obj)
    {
    if (obj == null)
    {
    return false;
    }
    if (!(obj is Point))
    {
    return false;
    }
    return (this.X == ((Point)obj).X) && (this.Y == ((Point)obj).Y);
    }

    public override int GetHashCode()
    {
    return X.GetHashCode() ^ Y.GetHashCode();
    }

    és ha a pnt-ket így módosítjuk:
    Point pnt = new Point(20, 20);
    Point pnt2 = new Point(15, 20);
    Point pnt3 = new Point(20, 20);
    Point pnt4 = new Point(21, 20);

    akkor a kimenet:
    Count = 3
    20 15 21
    Torlendo X érték: 20


    Count = 2
    15 21
    Utolso elem = 21

    Az elején itt is csak 3 érték van. Mivel pnt és pnt3 egyenlő.
    Tehát egyértelműen látszik, hogy a moderátor nem írt igazat azzal, hogy a Sethez köze sincs. De amiket itt írtam, azokra továbbra sincs válasz.
    A mostani kód így néz ki:
    namespace TesztCsharp
    {
    class HashSets
    {
    public static void Main(string[] args)
    {
    MyHashSet<HsPoint> myHashSet = new MyHashSet<HsPoint>();
    myHashSet.Add(new HsPoint(20, 20));
    myHashSet.Add(new HsPoint(19, 20));
    myHashSet.Add(new HsPoint(20, 20));
    myHashSet.Add(new HsPoint(15, 20));

    Console.WriteLine("Count = {0}", myHashSet.Count);

    foreach (HsPoint pt in myHashSet)
    {
    Console.Write("{0} ", pt.X);
    }

    int i;
    int torlendo = 20;
    Console.WriteLine("\nTorlendo X érték: {0}", torlendo);
    for (i = myHashSet.Count - 1; i >= 0; --i)
    {
    HsPoint pt = myHashSet[i];
    if (pt.X == torlendo) myHashSet.Remove(pt);
    }

    Console.WriteLine("\n\nCount = {0}", myHashSet.Count);
    foreach (HsPoint pt in myHashSet)
    {
    Console.Write("{0} ", pt.X);
    }

    if (myHashSet.Count > 0)
    {
    i = myHashSet[myHashSet.Count - 1].X;
    Console.WriteLine("\nUtolso elem = {0}", i);
    }
    }
    }

    class MyHashSet<T> : HashSet<T>
    {
    List<T> myList = new List<T>();

    public T this[int index]
    {
    get
    {
    return ((myList.Count > index) && (index >= 0)) ? myList[index] : throw new IndexOutOfRangeException();
    }
    }

    public bool Add(T item)
    {
    if (base.Add(item))
    {
    myList.Add(item);
    return true;
    }
    else return false;
    }

    public bool Remove(T item)
    {
    if (base.Remove(item))
    {
    myList.Remove(item);
    return true;
    }
    else return false;
    }
    }

    class HsPoint
    {
    public int X; public int Y;

    public HsPoint(int x, int y)
    {
    X = x;
    Y = y;
    }

    public override bool Equals(object obj)
    {
    if (obj == null)
    {
    return false;
    }
    if (!(obj is HsPoint))
    {
    return false;
    }
    return (this.X == ((HsPoint)obj).X) && (this.Y == ((HsPoint)obj).Y);
    }

    public override int GetHashCode()
    {
    return X.GetHashCode() ^ Y.GetHashCode();
    }
    }
    }

    De ebben már csak finomítások vannak.

Aktív témák