Dodawanie informacji do kolekcji HashSet.

0

Witam, mam taki oto problem, napisałem classe

import java.util.*;
public class ZbiorPunktow extends LepszyPunkt
{
    HashSet<LepszyPunkt> Zbior = new HashSet<LepszyPunkt>();
    public ZbiorPunktow()
    {
    }
    public void dodaj(int x, int y)
    {
        Zbior.add(new LepszyPunkt(x,y));
    }   
}

W instrukcji main mam:

ZbiorPunktow Spis = new ZbiorPunktow();
int ile = 0;
ile = in.nextInt();
        for(int i = 0; i<ile;i++)
        {
            x = in.nextInt();
            y = in.nextInt();
            Spis.dodaj(x,y);
        }

Mój problem polega na tym, iż jak chcę później to wyświetlić, to w kolekcji jest TYLKO jeden element, obojętnie ile bym nie dodał i ZAWSZE jest to pierwszy który dodaje - dlaczego się tak dzieje?

0

Bo masz błąd w tej części, której nie podałeś. ATSD prawie na pewno nie chcesz, żeby ZbiorPunktow rozszerzal klasę LepszyPunkt

0

To znaczy, polecenie było taki, iż - Napisac klase ZbiorPunktow dziedziczac po kolekcji HashSet<LepszyPunkt> - więc pomysłem, który wpadł mi do głowy, było dziedziczenie po Lepszym punkcie dodając tam kolekcje.

2

Zgodnie z poleceniem, wystarczy to:

import java.util.*;

public class ZbiorPunktow extends HashSet<LepszyPunkt>
{
}

A potem

ZbiorPunktow zbior = new ZbiorPunktow();
int ile = in.nextInt();
for(int i = 0; i<ile;i++)
{
      x = in.nextInt();
      y = in.nextInt();
      zbior.add(new LepszyPunkt(x,y));
}

Nie znam klasy LepszyPunkt, może konstruktor musi być inny.

0

Oto klasa LepszyPunkt:

public class LepszyPunkt extends Punkt
{
    private Punkt A;
    public char znak;
    public LepszyPunkt()
    {
        A = new Punkt();
        znak = 'A';
    }
    public LepszyPunkt(int x)
    {
        A = new Punkt (x);
        znak = 'A';
    }
    public LepszyPunkt(int x, int y)
    {
        A = new Punkt (x,y);
        znak = 'A';
    }
    public String toString()
    {
        return znak + A.toString();
    }
    public boolean equals(Object o)
    {
        Character znak1 = znak;
        if (o == this) return true;
        if (!(o instanceof LepszyPunkt)) return false;
        LepszyPunkt B = (LepszyPunkt)o;
        if((znak1 != null) && (((Character)B.znak != null)))
        return znak1.equals(B.znak);
        else
        return false;
    }
    public int hashCode() {
        final int hash = 5;
        Character znak1 = znak;
        return (hash * znak1.hashCode());
    }
}

Polecenie wcześniej było napisać trzy konskruktory, które domyślnie nadają punktowi znak A, plus parę metod.

Teraz analizując ten kod - czy jeżeli wszystkie punkty, będą oznaczone ZNAKIEM = A, ale różniły się x i y, to nie będę mógł dodawać do tej kolekcji kilku punktów?

Chyba, żeby przyjąć to jako błąd i konskruktor by wyglądał np. tak:

     public LepszyPunkt(int x, int y,Character znak)
    {
        A = new Punkt (x,y);
        if(!(znak == null))
         this.znak = (char)znak;
else
this.znak = 'A';
    }

Czy "znak" mógł być problemem dodawania tylko jednego punktu??

1

A jak niby kolekcja bazujaca na hashcodach miala rozroznic te obiekty, jak generowaly ten sam hash? O.o

W ogole te dwie metody (equals, hashcode) sa kompletnie bez sensu.

Przeczytaj sobie Effective Java od 33 do 51 strony.

No i... w gruncie rzeczy cala klasa LepszyPunkt jest do wyrzucenia. Jak dziedziczysz po klasie A, to juz nie tworzysz obiektu klasy A w srodku, tylko operujesz na odziedziczonym interfejsie.

0

Dzięki za pomoc. Mam jeszcze jeden problem, mam stworzyć kolekcje treeset, która będzie posortowana według długości od początku układu współrzędnych (liczy mi to metoda odleglosc())

   public TreeSet<LepszyPunkt> posortowane(ZbiorPunktow Spis)
   {
       LepszyPunkt sor = null;
       for(LepszyPunkt ob: Spis)
       {
           sor = ob;
           break;
       }
       TreeSet<LepszyPunkt> sort = new TreeSet<LepszyPunkt>(sor.odleglosc());
       for(LepszyPunkt ob: Spis)
       sort.add(ob);
       return sort;
   }

Problem w tym, że nie chcę sortować mi tej kolekcji po double(typ metody dlugosc()), no w sumie nic dziwnego bo to kolekcja Obiektów typu LepszyPunkt, tylko jak to zrobić?

0

Jako argument do konstruktora TreeSet<LepszyPunkt> musisz przekazać Comparator. http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

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