• 1
  • 2
2013-05-24, 04:06
  #1
Medlem
Hej!

jag håller på med följande metod den ska loppa genom länkade listan och kollar om den finns objekten student, om den hittar retunerar true annars falsk men det funkar inte, det är nåt fel med if satsen men vet ej hur kan jag lösa den någon som kan hjälpa?





Kod:
public boolean contains(Student x){
	
	Node temp=header;
	
	while(temp.next!=null){
		
		if(temp.next.stud.equals(x)){
			
			return true;
			
			
		}
		
		
		temp=temp.next;
		
	}
	return false;
	}

MVH Agneos
Citera
2013-05-24, 04:24
  #2
Medlem
Det är två saker jag hittar som kan fela här. Nu vet jag inte om header innehåller någon data eller bara är en pekare, men om objektet du letar efter finns i noden header kommer din kod inte att hitta den.

Och så undrar jag om du har testat metoden Studen.equals() så att du vet att den fungerar.
Citera
2013-05-24, 04:43
  #3
Medlem
svallerbyttans avatar
Täcker du fallet om temp = null?
Citera
2013-05-24, 08:39
  #4
Medlem
Citat:
Ursprungligen postat av svallerbyttan
Täcker du fallet om temp = null?

För att förtydliga menar du fallet då header = null, eller hur?
Citera
2013-05-24, 08:52
  #5
Medlem
Har du gjort equals metoden?
Säker på att den fungerar?
Citera
2013-05-24, 14:24
  #6
Medlem
ja det är problem med equals metoden header är null. varför får jag false hela tiden?

Kod:
// metoden retunerar true om persNummer för två Studentobjekt är lika. 
	public boolean equals(Object other){
		
		if(other!=null){
			
			return this==other;
	}
		
		else{System.out.print("erro");}
		
		return false;
	}
Citera
2013-05-24, 14:51
  #7
Medlem
dMobergs avatar
Citat:
Ursprungligen postat av agneos
ja det är problem med equals metoden header är null. varför får jag false hela tiden?

Kod:
// metoden retunerar true om persNummer för två Studentobjekt är lika. 
	public boolean equals(Object other){
		
		if(other!=null){
			
			return this==other;
	}
		
		else{System.out.print("erro");}
		
		return false;
	}

har du overloadat ==? (jag kan inte java)
annars ser det ju ut som du bara jämför om det är exakt samma objekt. alltså samma adress i minnet.

sen av det markerade förstår jag ingenting. förklara bättre, eller posta mer av din kod
Citera
2013-05-24, 15:09
  #8
Medlem
Kod:
import java.lang.*;
public class Student implements Comparable{
	

	private String persNummer;
	private int credits;
	
	
	public Student( String nr){
		
	persNummer = nr;
	}
	
	// metoden retunerar true om persNummer för två Studentobjekt är lika. 
	public boolean equals(Object other){
		
		if(other!=null){
			
			
		
			return 	other==this;
	}
		
		else{System.out.print("erro");}
		
		return false;
	}
	
	
	@Override
	
	
	public int compareTo(Object o) {
		
		
		
		
		return Integer.valueOf(credits).compareTo((Integer) o);
	}

		
	
	public static void main(String []Args){
		
		Student milad=new Student("111");
		Student milad2=new Student("111");
		
		System.out.println(milad2.equals(milad));
		
		
		
	}
	
	
	
	
}

equals ska jämföra två objektens person nummer.
Citera
2013-05-24, 16:35
  #9
Medlem
PhilDunphys avatar
Citat:
Ursprungligen postat av agneos

equals ska jämföra två objektens person nummer.

Har du testat att göra det? Som dMorberg säger är jämför == operatorn om det är exakt samma objekt du kollar på. Som du själv skriver, i din equals metod testa ta pnummer1.equals(pnummer2). När du löst detta kan du ju testa köra din compareTo metod
Citera
2013-05-24, 17:12
  #10
Medlem
EDIT: jag har löst det på detta sättet men jag vill lösa det utan att lägga till getpers() metoden går det?

Kod:
public boolean equals(Object other){
		
		//Student m=(Student)other;
		
		if(other!=null){
			
			
		
			return 	other.equals(this.getpers());
	}
		
		else{System.out.print("erro");}
		
		return false;
	}
__________________
Senast redigerad av agneos 2013-05-24 kl. 17:23.
Citera
2013-05-24, 17:58
  #11
Medlem
Mr.Svenssons avatar
Citat:
Ursprungligen postat av dMoberg
har du overloadat ==? (jag kan inte java)
annars ser det ju ut som du bara jämför om det är exakt samma objekt. alltså samma adress i minnet.

sen av det markerade förstår jag ingenting. förklara bättre, eller posta mer av din kod

Ville bara tillägga att Java inte stödjer operator överlagring.

Citat:
Ursprungligen postat av agneos
EDIT: jag har löst det på detta sättet men jag vill lösa det utan att lägga till getpers() metoden går det?

Kod:
public boolean equals(Object other){
		
		//Student m=(Student)other;
		
		if(other!=null){
			
			
		
			return 	other.equals(this.getpers());
	}
		
		else{System.out.print("erro");}
		
		return false;
	}

Nu vet jag inte riktigt vad getpers metoden gör, men antagligen returnerar den inte ett objekt av typen "Student" och därmed kommer alltid other.equals(this.getpers()); returnera false.

När man överlagrar en metod (equals i Object-klassen i det här fallet) så måste sin egen implementation uppfylla metodens API, se: http://docs.oracle.com/javase/7/docs...lang.Object%29 för att undvika underligt beteende.

I andra ord borde din equals metod se ut följande sätt:

Kod:
@Override
public boolean equals(Object obj) {
     if (this == obj) {
           return true;     //Om this och obj pekar på samma objekt, returnera true
     }

     //Kollar om obj är av typen "Student"
     if (!(obj instanceof Student)) {
          return false;
     }

     //Vi vet att obj är av typen "Student" och kan då typomvandla utan risk för ClassCastException
     Student s = (Student)obj; 

     //Undersök nu om personnumret är samma
     return this.persNummer == s.persNummer;
}

Värt att tillägga är att man även borde överlagra hashCode metoden när man överlagrar equals metoden.
__________________
Senast redigerad av Mr.Svensson 2013-05-24 kl. 18:06.
Citera
2013-05-24, 18:00
  #12
Medlem
dMobergs avatar
Citat:
Ursprungligen postat av agneos
EDIT: jag har löst det på detta sättet men jag vill lösa det utan att lägga till getpers() metoden går det?

Kod:
public boolean equals(Object other){
		
		//Student m=(Student)other;
		
		if(other!=null){
			
			
		
			return 	other.equals(this.getpers());
	}
		
		else{System.out.print("erro");}
		
		return false;
	}
Det här blir ju jätteroligt. Du vet vad din equals funktion gör? den an ropar equals på andra objektet. Men equals tar ju inte en personnummer som inparameter så det blir konstigt.

Hint: du måste anropa getpers på others-objektet
på this-objektet är det ju bara ta den privata medlemsvariabeln pers. (även om getpers funkar.)

persnonumret är en vanlig int eller? i så fall är det bara jämföra dem med ==
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in