01/10/2018, 17:17
Sử dụng phương thức toString() không ra đúng kết quả
Mọi người giúp e cái này với ạ. e thêm số kiểu phân số e bỏ vào mảng dùng toString thì nó k in ra gì hết, còn e in cái đối tượng mà e gán cái phân số đó ra thì nó ra địa chỉ của lớp. Em tìm dạng này trên google thì không ra vì em không biết keyword dạng này là gì. Em cảm ơn ạ.
class1:
package array_of_fraction;
import java.util.Scanner;
public class Fraction {
private int numerator;
private int demoninator;
Scanner Sc = new Scanner (System.in);
public Fraction(){
this.numerator = 0;
this.demoninator = 1;
}
public Fraction(int n, int d) {
this.numerator = n;
this.demoninator = d;
}
public void input() {
System.out.println("Enter the numerator: ");
this.numerator = Sc.nextInt();
System.out.println("Enter the demonimntor: ");
this.demoninator = Sc.nextInt();
}
public void output() {
System.out.println(this.numerator+" /"+this.demoninator);
}
}
class 2:
package array_of_fraction ;
import java.util.Scanner ;
public class ArrayOfFraction {
private int numerator ;
private int demoninator ;
private Fraction []a;
private int n ;
private int capacity ;
Scanner Sc = new Scanner(System.in) ;
public ArrayOfFraction() {
capacity = 10 ;
n = 0 ;
a = new Fraction[ capacity ] ;
}
public ArrayOfFraction( int n, Fraction a[] ) {
this.capacity = capacity ;
n = 0 ;
a = new Fraction[this.capacity] ;
}
public void add(Fraction element) {
// xu ly mang day
if (n == capacity) {
capacity = capacity * 2 ;
Fraction[] b = new Fraction[capacity] ;
for (int i = 0; i < n; i++)
b[i] = a[i] ;
a = b ;
}
// dien mang chua day
a[n] = element ;
n++ ;
}
public void output() {
for (int i = 0; i < n; i++)
System.out.println();
for (int i = 0; i < n; i++)
System.out.println(a[i].toString()) ;
}
public Fraction get(int index) {
if (index < 0 || index >= n) {
System.out.println("Invalid index") ;
// return tra ve truong hop dung cua if va ham phai kieu integer moi tra ve null
// duoc.
return null ;
}
return a[index] ;
}
public void set(int index, Fraction newelement) {
if (index < 0 || index >= n)
System.out.println("Invalid index") ;
else
a[index] = newelement ;
}
@Override
public boolean equals(Object f){
if((this.numerator == ( (ArrayOfFraction)f ).numerator) && this.demoninator == ( (ArrayOfFraction)f ).demoninator)
return true ;
return false ;
}
//@Override
public String toString() {
String s = "" ;
for (int i = 0; i < n;)
s = s + a[i] + " " ;
return s ;
}
public void add(int index, Fraction element) {
// xu ly mang day
if (index < 0 || index > n) {
System.out.println("khong hop le") ;
} else if (n >= capacity) {
capacity *= 2 ;
Fraction[] b = new Fraction[capacity] ;
for (int i = 0; i < n; i++)
b[i] = a[i] ;
a = b ;
}
if (n == index)
add(element) ;
// xu ly mang chua day
for (int j = n; j > index; j--)
a[j] = a[j - 1] ;
a[index] = element ;
n++ ;
}
public int capacity() {
return capacity ;
}
public void remove(int index) {
for (int j = index; j < n; j++)
a[j] = a[j + 1] ;
n-- ;
}
public static void main(String[] args) {
ArrayOfFraction frac = new ArrayOfFraction() ;
Fraction frac1 = new Fraction(3,4) ;
//Fraction frac2 = new Fraction(2,5) ;
// add frac1 theo cach pho thong
frac.add(frac1) ;
// hoac add frac2 theo cach 2
frac.add(new Fraction(2,5)) ;
System.out.println() ;
System.out.println(frac) ; // in ra dia chi
System.out.println(frac.toString()) ; // khong in ra gia tri cua mang va cung khong in ra dia chi cua mang
}
}
Bài liên quan
Đơn giản thôi, ở đoạn code trên bạn tạo thành 1 vòng for vô hạn Nên là nó vẫn đang xử lý chuỗi chứ không phải là không in ra . Sửa lại thành
for (int i = 0; i < n; i++)
là được nhé, lần sau chú ý mấy cái nàyThêm
i++
chưa giải quyết đc vấn đề của chủ thớt.Chủ thớt có thể tự giải quyết vấn đề của mình bằng cách trả lời câu hỏi sau:
output()
ở 2 class của bạn để làm gì? Và xem lại xem bạn đã dùng chúng ở đâu chưa?toString()
sẽ xử lí như nào, bạn muốn nó gọi vào hàm nào?Em in ra được rồi mà nó in ra địa chỉ a ạ
output() e viết thử nó để so sánh nó với hàm toString thôi a
toString() e muốn nó in ra các phần tử đã add vào mảng. mà nó k in phần tử mà in địa chỉ.
=_= ở
Fraction
bạn đã@Override
hàmtoString()
đâu, nên nó chỉ in ra địa chỉ là phảitoString()
là một hàm có sẵn củaObject
. Trong Java, mọi class đc tạo ra đều mặc định sẽ kế thừaObject
.Do đó, nếu trong class của bạn, cụ thể ở đây là
Fraction
, không override hàmtoString()
, thì khi dùngfraction.toString()
, sẽ gọi đếntoString()
củaObject
.Cái dãy “địa chỉ” mà bạn nói, chính là đoạn code:
getClass().getName() + "@" + Integer.toHexString(hashCode())
Do vậy, khi muốn in thông tin của class ra màn hình theo ý mình, bắt buộc bạn phải override hàm
toString()
:@Override e làm trước r mà k đc á, nên e comment nó lại , e ctrl+A đăng lên đây mà quên sửa.
@Override e làm trước r mà k đc á, nên e comment nó lại , xong e ctrl+A đăng lên đây mà quên sửa.
Bạn đăng cái
@Override
của bạn lên xem nào ?=_= Mình nói ở Class
Fraction
cơ mà.Ở đây bạn
+a[i]
tức là cộng thêm mộtFraction
chứ không phải là mộtString
, vì vậy hệ thống sẽ gọi hàmtoString()
củaFraction
. Mà bạn lại chưa viết lại (@Override
) toString() củaFraction
nên hệ thống sẽ mặc định dùngtoString()
của Object ==> In ra cái địa chỉ !Vậy nên nếu bạn muốn nó không in cái địa chỉ nữa thì
@Override
lại toString() ởFraction
nhéà, em hiểu rồi. e cảm ơn nhiều ạ