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
		

	}

}
Nguyễn Đình Anh viết 19:31 ngày 01/10/2018

for (int i = 0; i < n;)

Đơ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ày

locdt viết 19:33 ngày 01/10/2018

Thê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:

  • Hai hàm output() ở 2 class của bạn để làm gì? Và xem lại xem bạn đã dùng chúng ở đâu chưa?
  • Bạn kì vọng toString() sẽ xử lí như nào, bạn muốn nó gọi vào hàm nào?
hieu viết 19:32 ngày 01/10/2018

Em in ra được rồi mà nó in ra địa chỉ a ạ

hieu viết 19:20 ngày 01/10/2018

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ỉ.

Nguyễn Đình Anh viết 19:17 ngày 01/10/2018

=_= ở Fraction bạn đã @Override hàm toString() đâu, nên nó chỉ in ra địa chỉ là phải

locdt viết 19:23 ngày 01/10/2018

toString() là một hàm có sẵn của Object. Trong Java, mọi class đc tạo ra đều mặc định sẽ kế thừa Object.

Do đó, nếu trong class của bạn, cụ thể ở đây là Fraction, không override hàm toString(), thì khi dùng fraction.toString(), sẽ gọi đến toString() của Object.

Cái dãy “địa chỉ” mà bạn nói, chính là đoạn code:
getClass().getName() + "@" + Integer.toHexString(hashCode())

image

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 
public String toString() {
    return this.numerator+"/"+this.demoninator;
}
hieu viết 19:32 ngày 01/10/2018

@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.

hieu viết 19:26 ngày 01/10/2018

@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.

Nguyễn Đình Anh viết 19:22 ngày 01/10/2018

Bạn đăng cái @Override của bạn lên xem nào ?

hieu viết 19:28 ngày 01/10/2018
@Override
	public String toString() {
		String s = "" ;
		for (int i = 0; i < n;i++)
			s = s + a[i] + " " ;

		return s ;

	}
Nguyễn Đình Anh viết 19:20 ngày 01/10/2018

=_= Mình nói ở Class Fraction cơ mà.

s = s + a[i] + " " ;

Ở đây bạn +a[i] tức là cộng thêm một Fraction chứ không phải là một String, vì vậy hệ thống sẽ gọi hàm toString() của Fraction. Mà bạn lại chưa viết lại (@Override) toString() của Fraction nên hệ thống sẽ mặc định dùng toString() 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é

hieu viết 19:29 ngày 01/10/2018

à, em hiểu rồi. e cảm ơn nhiều ạ

Bài liên quan
0