funkcja contains

0

Dlaczego w tym kodzie funkcja contains zwraca false?
class Record {
String address_name;
String status;
Record(String a1,String a2){
address_name=a1;
status=a2;
};
}
public class zzzz {
public static void main(String[] args) {
ArrayList device = new ArrayList();
device.add(new Record("a","a"));
Record pom= new Record("a","a");

    System.out.println(device.contains(pom));            
}

}

0

Dokumentacja ArrayList:

contains

public boolean contains(Object o)

Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

Dokumentacja Object:

equals

public boolean equals(Object obj)

Indicates whether some other object is "equal to" this one.
......

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

Jak chcesz inaczej, to napisz metodę equals() w klasie Record.

0

Nie zabardzo rozumiem to co mi napisales. Byl bym bardzo wdzieczny jek bys poprwol mi kod, ktory by zwracal true jak znajdzie obiekt Record w liscie.

0

Bogdans wszystko Ci już wyjaśnił, jak dalej nie rozumiesz to bierz słownik od ang i tłumacz.

0

Weź się za angielski i naucz się korzystać z dokumentacji http://java.sun.com/javase/6/docs/api/

import java.util.*;
class Record
{
    String address_name;
    String status;
    Record(String a1,String a2)
    {
        address_name=a1;
        status=a2;
    }
    public boolean equals(Object o)
    {
        Record r=(Record)o;
        if(address_name.equals(r.address_name) && status.equals(r.status))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
public class D 
{
    public static void main(String[] args) 
    {
        ArrayList device = new ArrayList();
        device.add(new Record("a","a"));
        Record pom= new Record("a","a");
       
        System.out.println(device.contains(pom));            
    }
}
0

Zamiast pisac taki POST, ktory jest zbedny, popraw kod i bedzie po sprawie

0

bogdans wielkie dzieki, poprzedni wpis kierowalem do NoZi

0
bogdans napisał(a)

Weź się za angielski i naucz się korzystać z dokumentacji http://java.sun.com/javase/6/docs/api/

import java.util.*;
class Record
{
    String address_name;
    String status;
    Record(String a1,String a2)
    {
        address_name=a1;
        status=a2;
    }
    public boolean equals(Object o)
    {
        Record r=(Record)o;
        if(address_name.equals(r.address_name) && status.equals(r.status))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
public class D 
{
    public static void main(String[] args) 
    {
        ArrayList device = new ArrayList();
        device.add(new Record("a","a"));
        Record pom= new Record("a","a");
       
        System.out.println(device.contains(pom));            
    }
}

Moim zdaniem bezpieczniej będzie jak metodę equals napisze się tak:

public boolean equals(Object o)
{
	if (o instanceof Record) {
		Record r=(Record)o;
		if(address_name.equals(r.address_name) && status.equals(r.status))
		{
			return true;
		}
		else
		{
			return false;
		}
	} else {
		return false;
	}
}

;-)

0

albo jeszcze:

public boolean equals(Object o)
{
    if (this == o) return true;  // <--
    if (o instanceof Record) 
    {
        Record r=(Record)o;
        if(address_name.equals(r.address_name) && status.equals(r.status))
            return true;
        else
            return false;
    } else {
        return false;
    }
}

;)

0

szacun panowie.
Cienki strasznie bolek jestem w programowaniu javy i musze sprawdzic dlaczego przy korzystaniu z contains nalerzy pisac metode equals.

0

Cienki to jesteś z angielskiego. Metoda contains z klasy ArrayList przy podczas przeszukiwania korzysta z metody equals. Jeżeli w swojej klasie nie napiszesz metody equals, to w tej klasie będzie metoda equals odziedziczona z klasy Object. Metoda equals w klasie Object sprawdza równość referencji, a nie równość pól w klasie.

0
pok napisał(a)

szacun panowie.
Cienki strasznie bolek jestem w programowaniu javy i musze sprawdzic dlaczego przy korzystaniu z contains nalerzy pisac metode equals.

Metode equals piszesz zawsze, kiedy wiesz, ze bedziesz porownywal obiekty pod kontem tego, czy przechowuja dokladnie te same wartosci. Do porownania takiego wykorzystujesz wlasnie funkcje equals. Zwiazane jest to z tym, ze przez operator == sprawdzisz tylko, czy referencje tych obietkow sa rowne.

0

Dziekuje za wyjasnienie

0

Prawidłowy kod equals powinien wyglądać następująco(musimy sprawdzać nulle!):

public boolean (Object o)
{
    if ((o == null) || (!o instanceof Record)) return false; 
    Record r=(Record)o;
    if (status == null ? r.status != null : !status.equals(r.status)) return false;
    return address_name == null ? r.address_name == null : address_name.equals(r.address_name); 
}
0
__krzysiek85 napisał(a)

Prawidłowy kod equals powinien wyglądać następująco(musimy sprawdzać nulle!):


Kod jaki zaproponowal <b>kaziuuu</b> jest bardzo dobry, sytuacje z nullami zalatwia:
```java
if (o instanceof Record) 

ja dodalem jedynie lekka optymalizacje.

0

szacun panowie.
Cienki strasznie bolek jestem w programowaniu javy i musze sprawdzic dlaczego przy korzystaniu z contains nalerzy pisac metode equals.

A jak się nie zna języka polskiego to najpierw NALEŻAŁOBY się go nauczyć, a dopiero potem brać za Javę.

0

Witam, mam mały problem z funkcja contains, mam string:
String[] dontDownload = {"720p", "480p"};

i fora z if
for(int j=0; j<dontDownload.length; j++){

if(rssDownloadLink.contains(dontDownload[j])){
System.out.println("zawiera");
/System.out.println(rssDownloadLink);
}

Funkcja działa, bo zwraca link (z rssDownloadLink) które znajdują się w tablicy dontDownload. Ja natomiast chce by zwracało tylko te linki które nie zaiweraja, rzeczy z tej tablicy (dodanie "!" na początku if'a nic nie daje (zwraca wszystko));

Pozdrawiam.

0

Chyba chodzi Ci o inna metodę contains - z klasy String. Podaj przykład wartości zmiennej rssDownloadLink, dla której powyższy kod działa Twoim zdaniem źle.

0

I proponuje @pok zapoznać się z podstawami obiektowości, wtedy może zrozumiesz dlaczego (new A() != new A()) == true

0

aa no pewnie, że Ci zwróci wszytko bo zawsze sprawdzasz 2 wartości 720p i 480p.
Jak jest 720p to ci to pominie, ale sprawdzi potem dla 480p, tegop juz nie znajdzie i uzna za prawidłowy;] proste.
Musisz dodać do swojego ifa ze jak !czyzawiera.(string) wtedy niedodawaj i break - w ten sposób po pierwszym trafieniu na "zakazaną" frazę, przerwie dalsze sprawdzanie.
Jak masz taką tablice i ona będzie stała to lepiej stroić coś takiego

if(!link.contains(zakazane1) && links.contains(zakazane2)
{
link jest cacuszko!
}
else
link ssie, niech sp... idzie sobie w  niepamięc
0

@Antoniossss

Dzięki wielkie :)

0

spoooooko ;]
btw na przyszłość, weź zakładaj faktycznie nowe tematy, bo dopiszesz do takiego starocia, on mi się jako nowy pokaże, a ja mądry napiszę coś na pierwszej stronie skomentuje czy coś i mianują mnie ponownie archeologiem, bo nie sprawdzę daty wątku- bo skąd mógłbym się spodziewać, że to nie nowy wątek;P

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