2012-02-29 24 views
5

Đây là chương trình Phân số. Tôi có ints num và den, Fraction và FractionInterface - vấn đề bài tập về nhà tiêu chuẩn. Tôi đã làm khá nhiều thứ và bây giờ đã bị mắc kẹt trong một vài giờ trên phương thức equals. Vì khác là một đối tượng, tôi không thể đánh đồng nó với Phân số. Dưới đây là những gì tôi có:boolean công bằng bằng (Đối tượng khác)

public boolean equals(Object other){   
    if (other == this){ 
     return true; 
    } else { 
     return false; 
    } 
} 

này biên dịch nhưng nó mang lại kết quả không chính xác:

1/2 eq 1/2 = true 
1/2 eq 1/2 = true 
1/2 eq 1/2 = false 
1/2 eq 1/2 = false 

Nếu tôi cố gắng Phân == khác, nó không biên dịch. Cảm ơn vì bất kì sự giúp đỡ!

+1

Bạn có biết lớp học nào là 'khác' không? Ngoài ra, +1 để đánh dấu bài tập về nhà này và câu hỏi được đặt ra tốt! – macduff

+0

Lưu ý rằng hầu hết các câu trả lời cho đến nay sẽ thất bại nếu 'khác' thực hiện' FractionInterface' nhưng không phải là lớp 'Phân số'. Bạn nên rõ ràng trong tâm trí của bạn cho dù bạn muốn một giải pháp mà chỉ hoạt động khi 'khác' là một thể hiện của' phân số', hoặc một trong đó hoạt động khi 'khác' là một thể hiện của' phân số' hoặc một trong các lớp con của nó, hoặc một hoạt động với bất kỳ đối tượng nào thực hiện 'FractionInterface'. Bạn cần mã khác nhau cho từng trường hợp. –

Trả lời

1

Hãy thử điều này:

Thứ nhất, cast đối tượng other

Fraction otherFraction = (Fraction) other; 

Sau đó, xác định với điều kiện là hai phân số là tương đương. này sẽ bao gồm một số logic liên quan đến việc so sánh các tử số và mẫu số (hy vọng sẽ sử dụng getNum()getDen() cho otherFraction.

+2

Điều này có thể nổ tung nếu khác là loại sai. –

+0

Cảm ơn! Tôi đã thử đúc vật thể 'khác' giống như bạn nói, nhưng thay vì lấy tử số và mẫu số từ nó, tôi đã cố gắng so sánh trực tiếp nó với phần còn lại. Tuy nhiên, một sai lầm đơn giản tôi đã làm. Nó hoạt động ngay bây giờ, sử dụng phương thức Get và phép nhân chéo. Cảm ơn một lần nữa !! – Boris4ka

+0

Cuộc gọi tốt James. Tôi nhớ trong lớp AP Java của chúng tôi, chúng tôi đã không dự kiến ​​sẽ làm bất cứ điều gì về thực tế rằng tuyên bố này có thể nổ tung. Không cần phải giới thiệu sự phản chiếu, tôi có thể gợi ý cho người mới bắt đầu thử các công cụ gói trong các câu lệnh cố gắng nắm bắt. –

0

Bạn cần phải kiểm tra xem đối tượng có lớp Fraction, và nếu như vậy, bỏ nó vào một Fraction:

if (other.getClass() != Fraction.class) { 
    return false; 
} 
Fraction otherFraction = (Fraction) other; 
// compare the fields of this and otherFraction 

Trước khi làm điều này, hãy chắc chắn cũng để kiểm tra null.

+1

Vì tò mò, tại sao không sử dụng 'instanceof'? –

+0

Bởi vì nếu phân số được mở rộng và subclass ghi đè bằng, sử dụng instanceof sẽ phá vỡ hợp đồng bằng: 'fraction.equals (subFraction)' sẽ là true, trong khi 'subFraction.equals (fraction)' sẽ là false. –

+0

Rất khó để thực hiện bằng đúng với 'instanceof' nếu Phân số có phân lớp, vì vậy getClass là một giải pháp thay thế phổ biến. – Joni

0

Bạn đang so sánh rằng hai tham chiếu đối tượng tham chiếu đến cùng một đối tượng.

Bạn sẽ cần phải kiểm tra xem other có thuộc loại Fraction và sau đó nhập truyền vào một số Fraction. Sau đó, bạn sắp so sánh hai phần của Fraction.

2

Bạn có thể kiểm tra nếu other là một thể hiện của FractionInterface và sử dụng một dàn diễn viên:

public boolean equals(Object other){   
    if (other == this){ 
     return true; 
    } else if (other instanceof FractionInterface) { 
     FractionInterface fOther = (FractionInterface) other; 
     // compare numerator and denominator... 
    } else { 
     return false; 
    } 
} 

Lưu ý rằng instanceof sẽ false nếu other == null, nên không cần thiết cho một kiểm tra null riêng biệt.

1

Bạn nên kiểm tra xem các đối số là một thể hiện của lớp học của bạn và gửi lại false nếu nó không và dàn diễn viên là nó đến lớp học của bạn và so sánh theo yêu cầu của bạn nếu nó là nó phổ biến để viết equals() phương pháp như thế này:.

public boolean equals(Object obj) { 
    if (!(obj instanceof Fraction)) { 
     return false; 
    } 
    Fraction that = (Fraction) obj; 
    ... // Your algorithm to compare two fractions: this and that. 
} 

bạn nên chắc chắn rằng thuật toán của bạn để so sánh hai phân số đáp ứng tất cả các yêu cầu được mô tả trong equals()documentation.

-1

== toán tử so sánh mã băm của đối tượng. Đó là lý do tại sao phương pháp của bạn không ổn, bạn nên viết như sau:

public boolean equals(Object other){   
    if (other instanceof Fraction){ 
     return ((Fraction)other).getNum == this.num && ((Fraction)other).getDen == this.den; 
    } else { 
     return false; 
    } 
} 
+3

Điều này là sai !! == so sánh những gì được lưu trữ trên ngăn xếp. Đối với nguyên thủy, đây là giá trị acctual và cho các đối tượng, nó là tham chiếu đến heap có đối tượng được lưu trữ. Các hashcode nên được bình đẳng cho hai đối tượng bởi vì sẽ có vấn đề sau đó sử dụng hashmaps – nist

+0

Có bạn là đúng xấu của tôi. Đó là đêm khuya khi tôi đang gõ câu trả lời :) –

0

Tôi nghĩ bạn thân thiết, nhưng bạn thiếu một số khái niệm chính. Điều này là do bạn sẽ không hoạt động trong mọi tình huống. Hãy thử ví dụ này bằng cách sử dụng mã hiện tại của bạn ...

Fraction a = // this is however you're making a fraction object... 
Fraction b = // do EXACT same thing here that you did for a 

// And then, this will illustrate what is wrong with your program... 
if(a.equals(b)) { 
    System.out.println("This won't print"); 
} else { 
    System.out.println("This will print because your method just checks for reference"); 
} 

Vì vậy, đây là những điều cơ bản bạn cần phải hiểu:

  1. Sự khác nhau giữa ==equals
  2. So sánh kiểu như trái ngược với tham chiếu hoặc giá trị
  3. Tránh đúc bằng cách đặt của bạn "bằng" ở đúng nơi

Trước hết ...

public boolean equals(Object other){   
    if (other == this){ 
     return true; 
    } else { 
     return false; 
    } 
} 

Bạn đang thiếu điểm của phương thức "bằng" trong Java. == được sử dụng để so sánh tài liệu tham khảo trong khi this.equals(foo) được sử dụng để đặt logic để so sánh các đối tượng ở một địa điểm được bản địa hóa.

Khái niệm khác bạn đang thiếu là cách sử dụng instanceof. Khi bạn hỏi điều này ...

Nếu tôi thử khác == Phân số, nó không biên dịch.

Điều này là do bạn đang tìm cách so sánh loại đối tượng. Để thực hiện việc này, bạn chỉ cần thực hiện ...

if(other instanceOf Fraction) { 
    // do stuff... 
} 

Tất cả điều đó được nói, có một khái niệm cuối cùng, đặt định nghĩa bằng ở vị trí thích hợp. Bạn cần phải đặt nó bên trong lớp Fraction của bạn và xác định nó như thế này ...

public boolean equals(Fraction other) { 
    // do something like this (you will have to define toDouble) 
    if(this == other || this.toDouble() == other.toDouble()) { 
    return true; 
    } 

    return false; 
} 

này sẽ ghi đè mặc định ...

public boolean equals(Object other) {/* ... */} 

Và nó sẽ làm cho nó cực kỳ thuận tiện. Dưới đây là một số mẫu mã như thế nào ...

Fraction fractionA = new Fraction("2/4"); 
Fraction fractionB = new Fraction("1/2"); 
Fraction fractionC = new Fraction("1/3"); 
Object trollObject = new Object(); 

// And then call random equals objects... 
if(fractionA.equals(fractionB)) { 
    // should be true... 
} 

if(fractionB.equals(fractionA)) { 
    // should be true... 
} 

// This avoids having to do any casting because 
// since you've only defined a Fraction.equals(Fraction) method 
// it should instead default to the Object.equals method 
if(trollObject.equals(fractionB)) { 

} 
0

Dưới đây là một mô hình khá chuẩn:

public boolean equals(Object other) { 
    if (other == this) return true; 
    if (other == null) return false; 
    if (other.getClass() != this.getClass()) return false; 

    Fraction o = (Fraction) other; 
    // now you compare their num, den, and possibly sign 
} 

Mọi người có thể tranh luận nếu chúng ta nên sử dụng getClass() hoặc instanceof. Nó chỉ quan trọng nếu Fraction được mở rộng, và nó phụ thuộc vào những gì bạn muốn nếu nó được mở rộng. Chỉ cần nhớ rằng hợp đồng của equals()a.equals(b) sẽ nhận được kết quả tương tự như b.equals(a) nếu không ai là null và lớp con có thể có một khác nhau equals() có khả năng phá vỡ hợp đồng.

+0

Điều này cũng sẽ không hoạt động nếu 'other' không phải là một' phân số' ở tất cả, nhưng một số đối tượng khác đang triển khai 'FractionInterface'. –

+0

Phải. Nó thực sự phụ thuộc vào những gì bạn muốn nếu 'other' không phải là một' phân số' nhưng thực hiện 'FractionInterface'. Đó là một khu vực màu xám. Khi nghi ngờ, tôi thích trả lại 'sai'. Nếu 'other' có trường' sign' phụ và chúng ta không có quyền truy cập vào nó, chúng ta chỉ cần trả về 'false' –

-1

Tôi hy vọng nó sẽ hữu ích cho bạn. Hãy thử mã này.

import java.io.*; 

class Cast 

{ 

public static void main(String args[]) throws IOException 

{ 

BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 

byte a=20; 

short s=31468; 

int i=12345678; 

char c=’c'; 

float f=3.56f; 

//Widening or promotion [java question bank][1] 

System.out.println(“a=(short) “+(short) a); 

System.out.println(“a=(int) “+(int) a); 

System.out.println(“a=(long) “+(long)a); 

System.out.println(“a=(float) “+(float)a); 

System.out.println(); 

System.out.println(); 

System.out.println(“s=(int) “+(int)s); 

System.out.println(“s=(long) “+(long)s); 

System.out.println(“s=(float) “+(float)s); 

System.out.println(); 

System.out.println(); 

System.out.println(“i=(long) “+(long)i); 

System.out.println(“i=(float) “+(float)i); 

System.out.println(“i=(double) “+(double)i); 


//Narrowing using [java question bank][2] 

System.out.println(“f=(byte) “+(byte)f); 

System.out.println(“f=(short) “+(short)f); 

System.out.println(“f=(char) “+(char)f); 

System.out.println(“f=(long) “+(long)f); 

System.out.println(); 

System.out.println(); 

System.out.println(“i=(byte) “+(byte)i); 

System.out.println(“i=(short) “+(short)i); 

System.out.println(); 

System.out.println(); 

System.out.println(“s=(byte) “+(byte)s); 


} 

} 
+0

Tôi không chắc chắn điều này sẽ giúp OP. Chăm sóc để xây dựng? – GHC

Các vấn đề liên quan