Porównanie obiektów equalsem

0

Jak to zrobic za pomocą equals(albo za pomocą if, tylko jak przeslonic metode toSpring?)? Program uzupelnil juz tablice losowymi wartosciami.

Oto fragment tresci zadania: Sprawdz czy w tablicy Array3D i array2D istnieją elementy mające wspolne skladowe (x,y) tj. istnieją punkty punkt2D(x1,y1) i punkt3D (x2,y2,z2), takie ze x1=x2 i y1=y2. Jesli takie pary istnieją wypisz je na ekranie(wykożystaj metode toString() ).

public static void main(String[] args) {
   (...)
System.out.println("--------------------------------");

Punkt2D [] array2D = new Punkt2D [100];
for(int i=0;i<array2D.length;i++){
array2D [i] = new Punkt2D() ;
array2D[i].LosujPunkty();

System.out.println(array2D[i]);
}

 

Punkt3D [] array3D = new Punkt3D [100];
for(int i=0;i<array3D.length;i++){
array3D [i] = new Punkt3D();
array3D[i].LosujPunkty();
System.out.println(array3D[i]);
}
System.out.println("-----------------"
    + "Porównywanie objektów equals:");


}    

Nawet jesli chce wygenerowac kod, to widzi tylko pola z obecnej klasy np z klasy punkt2D. A ja potrzebuje porównac tez z klasy punkt3D.

0

Wygeneruj tego equals i zobacz, może będzie dobrze :-) Metoda toString raczej nie powinna mieć z tym nic wspólnego.

A jak nie będzie dobrze - to pokaż definicję klas Punkt2D i Punkt3D.
Oraz jak porównujesz.

0

Nie do konca wiem jak dziala equals dlatego prosze o wyjasnienie.

package punkt2d;

;
import java.util.Random;

public class Punkt2D {

   private int x1,y1;

    public int getX1() {
        return x1;
    }

   (...)
   
   public Punkt2D(){   // konstruktor bezparametrowy ustwia x i y na 0
       this.setX1(0);
       this.setY1(0);
   }
   
   public Punkt2D(int x1, int x2){ //konstruktor ustawiajacy podane wartosci
       this.setX1(x1);
       this.setY1(x2);
   }
 Random rand = new Random();   // metoda losująca liczby
   public void LosujPunkty(){
    x1 = rand.nextInt(20)-10;
    y1 = rand.nextInt(20)-10;
   
   }

public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Punkt2D other = (Punkt2D) obj;
        if (this.x1 != other.x1) {
            return false;
        }
        if (this.y1 != other.y1) {
            return false;
        }
        return true;
    }

--------------------

package punkt2d;


public class Punkt3D extends Punkt2D {
    
  private int x2,y2,z;

    public int getX2() {
        return x2;
    }
(..)
    
    public Punkt3D(){
    this.setX2(0);
    this.setY2(0);
    this.setZ(0);
    }
    
    public Punkt3D(int x2, int y2, int z){
        this.setX2(x2);
        this.setY2(y2);
        this.setZ(z);
    }
    
    public void LosujPunkty(){
    x2 = rand.nextInt(20)-10;
    y2 = rand.nextInt(20)-10;
    z  = rand.nextInt(20)-10;
   }
    
  public void porownaj(Punkt2D dwaD, Punkt3D trzyD){
  dwaD.equals(trzyD);

  }


0

Znalazlem w internecie takie cos. Porównanie kazdy element tablicy o takim samym indeksie ale jak zrobic zeby porównywalo x1 z x2 i y1 z y2 ?

public boolean porownaj(Object[] o1, Object[] o2) {
              if (o1 == null || o2 == null)
                return false;
              if (o1.length != o2.length)
                return false;
              for (int i = o1.length - 1; i >= 0; i--) {
                if (!o1[i].equals(o2[i]))
                  return false;
              }
              return true;
            }
6

metoda toString() służy do wypisania danych klasy
metoda equals() do porównania dwóch obiektów tego samego typu

Metoda equals w twoim przypadku nie jest odpowiednim rozwiązaniem, napisz jakąś inną metodę do porównywania, która przyjmowała by obiekty tupu Punkt2D i Punkt3D, bo spójrz na warunek:

if (getClass() != obj.getClass()) {
         return false;
} 

(założeniem equals jest, że porównujemy obiekty tego samego typu, oczywiście mógłbyś na chama tam olać ten warunek, ale to by było mega słabe)

0

No własnie tak podejrzewalem ze sie nie da, myslalem, ze da sie jakosc wyłączyc "z", ale kombinowalem. Spróbuje to zrobic normalnie i wstawie pozniej kod :)

5
  private int x2,y2,z; 

to jest źle pomyślane. Patrz (kod skrócony, wrzucam istotny fragment):

public class Point2D {
    private int x;
    private int y;

    public Point2D(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Point3D extends Point2D {
    private int z;

    public Point3D(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }
 
  1. Samo porównywanie dwóch elementów na zasadzie:
public boolean compare(Point2D point2D, Point3D point3D){
        return point2D.getX() == point3D.getX() && point2D.getY() == point3D.getY();
}

Sprawdz czy w tablicy Array3D i array2D istnieją elementy mające wspolne skladowe (x,y)

Kod:

for (int i = o1.length - 1; i >= 0; i--) {
                if (!o1[i].equals(o2[i]))
                  return false;
}

porównuje pary punktów, czyli pierwszy punkt 2D z pierwszym 3D drugi 2D z 2 3D a nie każdy z każdym, a ja tak rozumiem treść zadania.

0

Byc moze numery przy x i y są w tresci zadania po to zeby zrozumiec sens, a tak naprawde ich nie powinno byc.

  1. To ma sens :)
  2. Tak powinno byc w tym przypadku?
  3. Nie wiem o co chodzi w sprawdzaniu wspolnych skladowych ? Ten kod porównuje elementy tablicy, czyli o1[i] {x, y} z o2[i] {x, y, z } czyli zawsze bedzie false ?
3

Słuzy do tego komparator(szczerze musze poczytac co to jest)? Bo napisales tak jakby "recznie", zwróc x jesli x == x, y y == y, czyli ze nie porownuje kazdy z kazdym, tak to rozumiem, wyjasnij w skórcie a ja sobie o tym poczytam :)

Nie no to jest jakaś twoja funkcja, którą możesz nazwać porównajDwaPunkty() i porównuje ona dwa punkty, w sumie tutaj nazwa mogłaby być inna czySąTeSame albo jakos tak, a żeby porównać każdy z każdym, to musisz dodać pętle dwie.

for(Point2D p2D : array2D){
      for(Point3D p3D : array3D){
            if(compare(p2D, p3D)){
                  System.out.println("Równe: " + p2D + " oraz " + p3D);
            }
      }
}

Bo napisales tak jakby "recznie", zwróc x jesli x == x, y y == y

Nie zwraca true lub false a nie x czy y.

A tka w ogóle to jestem kobietą, myślałam, że avatar + nick, to wystarczająca wskazówka.

0

Juz to rozumiem wyjasnilas mi wszystko.
Przepraszam bylem z byt zajety Javą i nie zwrócilem uwagi na takie szczegóły wybacz.

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