Hỏi về phương thức split() trong java

Hi all
Mọi người cho mình hỏi sao mình có file text ntn:Nguyen Van A, Ha Noi, 131, 4, 5, 55
Sao mình đọc file rồi dùng cái split như này: String[] st = ds.split(",") xong rồi add vào arraylist.Nhưng lúc mình add vào Arraylist

Staff s = new Staff(t[0], t[1], Double.parseDouble(t[2]));

nếu để như này thì không sao nhưng nếu để như này sẽ bị lỗi

Staff s = new Staff(t[0], t[1], Integer.parseInt(t[2]));

nó báo lỗi như này

Exception in thread "main" java.lang.NumberFormatException: For input string: " 1"

Mong mọi người chỉ giáo với ạ.Nếu theo cách 2 thì cách fix lỗi này ntn vậy ạ

Xóa khoảng trắng đầu và cuối chuỗi đi. String.trim().
Không thì cứ dùng double rồi ép kiểu về int.

Mà nhờ bạn mới biết Double.parseDouble() không kiểm tra hợp lệ “gắt” bằng Integer.parseInt().

4 Likes

B ơi sao ép rồi vẫn k dc vậy

p.setSo1((int)Double.parseDouble(ds[3]));

còn trim mình dùng st.trim() trước khi split() vẫn k dc

Có bao nhiêu cái “không được” vậy? Máy ảo Java nó bảo với bạn là “Không được!” à? Lỗi lãi gì thì nói rõ ra.

Tình hình chắc giúp bạn “không được” rồi, vì mình có vài vấn để “không được”. Mà quy định thì vài chỗ cũng… “không được”. Nhiều người xem cũng muốn giúp lắm, nhưng họ “không được”.

3 Likes

Khoảng cách giữa các trường không phải chỉ là dấu phẩy đâu :slight_smile:

3 Likes

khi mình add vào nó báo lỗi như thế này là sao vậy Index 1 out of bounds for length 1

ý bạn là thêm khoảng trắng nữa hay làm như thế nào

Ví dụ thế này:
Nguyen Van A, Ha Noi, 131, 4, 5, 55.

Khi split bằng , thì sẽ ra:

["Nguyen Van A", " Ha Noi", " 131", " 4", " 5", " 55"]

Nếu bạn để ý thì sẽ thấy từ phần tử thứ 2 trở đi thì sẽ có dấu cách ở đầu. Vì sao? Đơn giản thôi, các trường(field) trong chuỗi trên được phân cách bằng , chứ không phải là , thành ra là các phần tử từ cái thứ 2 trở đi bị dư dấu cách. Nếu chuỗi trên là:
Nguyen Van A,Ha Noi,131,4,5,55.

Thì đoạn trên sẽ chạy đúng. Cách giải quyết vấn đề này đơn giản là thay , thành , như @rogp10 đã nói

3 Likes

Bạn có chắc tất cả đều ngăn cách bằng dấu phẩy (,)?
Theo như thông báo của ngoại lệ thì sau khi tách, chỉ được 1 chuỗi duy nhất (length 1). Tức là chuỗi chẳng có dấu phẩy nào để tách.

3 Likes

do lúc nãy trong file chỉ có 4 dòng thôi, mà mình tạo thêm 2 dòng(khoảng trắng nên nó mới bị lỗi ấy)
sau mình chạy cái này nó ra lỗi ntn nhỉ:

public void show() {
	for(int i = 0;i < listPlayer.size(); i++ ) {
		System.out.println(listPlayer.get(i));
	}
}
Exception in thread "main" java.util.IllegalFormatFlagsException: Flags = ' ,'

Mình đã replace rồi xong add vào ArrayList nhưng xuất ra thì bị lỗi

Bạn thêm " ," hay ", " vậy :thinking: ?

1 Like

cái bạn nói cũng k hắn đúng thì “,” mình có đọc cmt mà
bài bên mình cũng để file ", " mà vẫn chạy được xuất được còn cái bài trên này nó bị lỗi như trên


Cái file text như thế này đây


Bài khác mình cũng để thử như bài kia nó vẫn ra kết quả mặc dù dòng code đọc file không có gì thay đổi

Hàm đọc file đây,mọi người xem lỗi ở đâu với ạ

public void readFilePlayer(String file)  {
		try {
			FileInputStream fir = new FileInputStream(file);
			InputStreamReader isr = new InputStreamReader(fir);
			BufferedReader br = new BufferedReader(isr);
			listPlayer.clear();
			while (true) {
				String st = br.readLine();
				if (st == null || st == " ")
					break;
				String[] ds = st.split(",");
	
				Player p = new Player();
				p.setHoTen(ds[0]);	
				p.setDiaChi(ds[1]);
				p.setSdt(ds[2]);
				p.setSo1(Double.parseDouble(ds[3]));
				p.setSo2(Double.parseDouble(ds[4]));
				p.setSo3(Double.parseDouble(ds[5]));
				p.setSo4(Double.parseDouble(ds[6]));
				p.setSo5(Double.parseDouble(ds[7]));
				p.setSo6(Double.parseDouble(ds[8]));
				p.setSo7(Double.parseDouble(ds[9]));
				listPlayer.add(p);
			}
			System.out.println("Them vao array list thanh cong");

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Thông báo ngoại lệ đã chỉ rõ dòng nào gây lỗi rồi đấy.
Bạn có dùng đến String.format() mà chưa biết cách định dạng các tham số. Trong tham số không có nhận cờ (flag) nào là " ," hết.

Có thấy nó báo Player.toString() không? Bạn sai ở đó.

4 Likes

lỗi ở toString
Mình ít sài String.format() nên lỗi mình đã sửa được rồi
mà cái split(",") vẫn được nha
Mình cảm mấy b nhiều

Mình thấy dòng cuối cùng của dữ liệu bạn bỏ trống => đây là nguyên nhân chỉ tách được 1 phần tử (length 1).

Bạn có thấy đoạn này ổn:

Chú ý đến st == " ":

  1. Dùng toán tử so sánh (==) để so sánh chuỗi cực kì không ổn.
  2. Bạn nên biết: dòng trống là dòng có chuỗi là "" chứ không phải " " (có 1 kí tự khoảng trắng).
3 Likes

Mà cái Integer.parseInt() vẫn lỗi kìa
qua bài này mình rút ra ít kinh nghiệm
vì file tách có khoảng trong chứ k phải là chỉ mỗi dấu , nên có 2 cách lam
1 dùng split(",") kiểu này nhưng bắt buộc phải dung (int)Double.parse() và phải ép kiểu về int vì bên class Player mình khải bảo int
2 là như b trên đã giải thích và mình replaceAll(", ", ",") rồi split(",") như này là thành công
Với thêm khi làm bài tập để ý file đầu vào không tự tiến xuống dòng file làm nó tính ‘’’’ là kí tự

Bữa mình có gặp lỗi này 1 lần rồi nhưng k nhớ
Giờ thì chắc nhớ muôn kiếp :smiley:

À, vẫn là cái trim() kia. Mình nghĩ bạn đã gọi đến trim() sai chỗ rồi. Bạn gọi trim() ngay khi dùng Integer.parseInt() chứ không phải trước khi split().
Như này nhé:

Integer.parseInt(ds[3].trim());
3 Likes

Hèn gì mình chạy k có đc
Thể là thêm cách nữa rồi đó

Cho mình hỏi là

Nguyen Van A, Ha Noi, 0123456789, 1, 23, 25, 30, 32, 25, 45
Nguyen Van B, Da Nang, 0123456788, 2, 23, 25, 30, 32, 25, 45
Nguyen Van V, Hue, 0123456787, 2, 23, 25, 30, 32, 25, 45
Nguyen Van X, HCM, 0123456786, 100, 23, 25, 30, 32, 25, 45

như file text trên mình kiếm tra xem các số

1, 23, 25, 30, 32, 25, 45
1, 23, 25, 30, 32, 25, 45
1, 23, 25, 30, 32, 25, 45
1, 23, 25, 30, 32, 25, 45

có giá trị nào lớn hơn 45 không thì mình dùng regex với phương thức matcher() để kiếm tra được k?
Có cách nào làm khỏi regex được k ?
mình viết regex mãi không được ?

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