Cần giải thích công dụng của đoạn code toStringVector

Mình có 1 đoạn code hàm mà mình ko hiểu công dụng của nó lắm bác nào rành giải thích dùm tý. Thanks!

     public String[][] toStringVector() {
     		String[][] total = new String[collection.size()][5];
 
     		for (int i = 0; i < collection.size(); i++) {
     			total[i][0] = collection.get(i).getTitle();
     			total[i][1] = collection.get(i).getAuthor();
     			total[i][2] = collection.get(i).getPrice();
     			total[i][3] = collection.get(i).getISBN();
     		}
     		return total;
     	}

Đưa từ dạng Collection của đối tượng để thành mảng 2 chiều. Mỗi dòng là 1 đối tượng, mỗi cột là 1 thuộc tính của đối tượng đó.
Trực quan hóa:

collection = {
Book = {Title = "Sách 1", Author = "Tác giả A", Price = "10000", ISBN = "?"},
Book = {Title = "Sách 2", Author = "Tác giả B", Price = "30000", ISBN = "??"},
Book = {Title = "Sách 3", Author = "Tác giả C", Price = "50000", ISBN = "???"}
}

Sẽ trở thành:

total = [
["Sách 1", "Tác giả A", "10000", "?", ""],
["Sách 2", "Tác giả B", "30000", "??", ""],
["Sách 3", "Tác giả C", "50000", "???", ""]
]

Mình chẳng hiểu là khai báo số cột là 5 nhưng chỉ đổ dữ liệu vào 4 cột, cột cuối để không. Chắc có thao tác gì nữa với cột cuối này nhỉ!? :thinking:

3 Likes

chắc là dong này

public Book() {
	isbn = 0;
	title = null;
	author = null;
	price = 0;
	vims = new ArrayList<VIM>(); // <--
}

Xin hỏi thêm chổ này mình có khai báo :slight_smile:

private File vimFile;

xong mình có dạng ép kiểu thế này

byte[] data = new byte[(int) vimFile.length()];

xin hỏi cái phần (int) vimFile.length() là ép kiểu từ file về int phải khộng .Vậy nguyên dòng này minh phải hiểu như thế nào vây?

Đó là ép từ kiểu long về int. vimFile.length() trả về kích thước của tập tin (kiểu long).

Bổ sung: nguyên dòng đó có nghĩa là tạo một mảng kiểu byte tên là data với số lượng phần tử bằng kích thước của tập tin. Tức là mảng byte này sẽ dùng để lưu nội dung của tập tin.

3 Likes

xin hỏi dòng code này dc hiểu như thế nào vậy !!!

String total = "\n";
 Iterator<Book> i = collection.iterator();
 		while (i.hasNext()) {
 			Book b = (Book) i.next();
 			total = total + b.toString();
 		}
 		return total;
 	}

Lấy thông tin mô tả (toString()) cho từng đối tượng Book trong collection.

3 Likes

thế dòng

 			Book b = (Book) i.next();

dịch là thế nào vậy??

Ái chà! Mấy thứ này cơ bản quá mà bạn!

  • Book b =: khai báo và gán.
  • (Book): ép kiểu. Thực ra cái này dư rồi.
  • i.next();: gọi đến phần tử tiếp theo.

Phần ép kiểu là dư thừa, vì i.next(); đã trả về kiểu Book rồi.

3 Likes

bạn thật là kiên nhẫn :v:

1 Like

thật ra mình hay viết theo cách dùng for cho nên găp cách viết này mình ko hỉu lắm ,tại mình ko rỏ lắm về downcast/ upcast nên gặp mấy cái này là đuối vậy nên mấy bác thông cảm!!!:sleepy:
nếu mình viết thì viết theo cách này :

  for (int i=0; i<collection.size(); i++){
		  Book b = collection.get(i);
		 total = total + b.toString();
		 }

ko bik có đúng không?

@hihi321code Em trả tiền gia sư cho anh @SITUVN.gcd đi, thấy ảnh kiên nhẫn giải thích từng chút 1 cho em rồi :smile:

4 Likes

e nghèo lắm anh ui!!! toàn mày mò tự học ko !!!

2 Likes

@hihi321code vậy thì tốt! Nếu vậy em nên phát huy tinh thần tự học nhiều hơn nữa, và nên đọc tài liệu tiếng Anh cho hiểu cặn kẽ, vì sách tiếng Anh viết tốt lắm. Vd hồi xưa anh đọc cuốn này:

4 Likes

Cách viết này của bạn cũng tương tự với dùng Iterator.
Nhưng trong cả 2, nếu chỉ cần gọi toString() thì không cần trường b (tạm) làm gì.

// Iterator
while(i.hasNext()){
    total += i.next().toString();
}

// Hoặc cách của bạn
for(...){
    total += collection.get(i).toString();
}

Cách này rút gọn, nhưng không có nghĩa là tối ưu. Biết đâu đấy gặp phải NullPointerException thì sao! :smiling_imp:

2 Likes

Thì minh cũng chỉ nghỉ dc tới đâu thì viết tới đó nó chạy dc là may còn chưa mong mỏi gì tối ưu. Tình hình là đang bơi trong đống bug và đang trong quá trình xử lý . Bởi vậy mới cầu viện các bác :sob:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?