Thắc mắc về == và equal() trong String

Xin chào mọi người,

Em mới học java với eclipse và có một vài thắc mắc.

Bài tập là kiểm tra xem số có phải hệ nhị phân hay không. Em có đọc và biết với String, ta cần phải dùng equal() để so sánh giá trị trong object, còn == chỉ so sánh hai object. Nhưng ở đây, em so sánh char, không phải String, kết quả vẫn là sai.

Mọi người có thể giải thích giúp em tại sao không ạ?

Em cảm ơn.

Yêu cầu bạn đăng đoạn mã (dạng văn bản) thay vì dùng hình chụp!


Kết quả sai thế nào vậy bạn?

"10100000110" // true
"1234567890" // true
"1 con mèo" // true
"Đây 0 phải chuỗi nhị phân" // true
2 Likes
public class Zahlensysteme {

	
	public static boolean istDualZahl(String zahl)
	
	
	{for(int i =0;i<zahl.length();i++)
	{
	char temp = zahl.charAt(i);
	if(temp==1||temp==0 )
	{
	return true;
	}
	}
	return false;}	

public static void main(String[] args) {
		
		System.out.println(istDualZahl("101010")); // phải trả về true
		System.out.println(istDualZahl("123")); // phải trả về false

	}
}
		
false
false

Bài tập yêu cầu số đã cho chỉ có thể chưa 0 hoặc 1 thôi ạ. Như kết quả của anh thì ngoài dòng đầu, các dòng còn lại phải trả về false mới đúng.

temp==1

hay

temp=='1'

?

Với cả, nếu như em muốn kiếm tra chuỗi mà chỉ có '1' hoặc '0' mà thuật toán như thế là sai rồi.

1 Like
temp == '1' 

ạ.

Tại trước đó em đã tạo

char temp = zahl.charAt(i);

sau đó kiểm tra char chứ không phải String nữa. Như vậy là sai ạ?

  1. 1'1' là khác nhau. x == '1' tương đương với x == 49 (tìm hiểu về ASCII)
  2. Thuật toán của bạn chỉ đảm bảo trong dãy có ký tự 0 hoặc 1, không đảm bảo cả dãy đều là 0/1
2 Likes

vậy nếu muốn đảm bảo cả chuỗi chỉ có 0 và 1 thì phải làm thế nào ạ? a chỉ giúp em với

Tức là nếu có phần tử nào không phải là 0 hoặc 1 thì lập tức trả về false

2 Likes

Vâng đúng là thế đó ạ. Em thấy bạn em sử dụng != sau đó return false, nhưng không hiểu tại sao không thể dùng == , return true mà phải dùng phủ định

Trong hình là '0''1', đoạn mã lại là 01. Có nhầm lẫn gì rồi!

Vâng, @noz1995 nói đùng rồi đó. Bạn phải dùng phủ định != và trả về false.

  • if(temp!='0'&&temp!='1'){return false;}: Không phải '0''1' thì không phải chuỗi nhị phân. Đảm bảo, không cần xét các kí tự phía sau nữa.
  • if(temp=='0'||temp=='1'){return true;}: '0' hoặc '1' thì chắc chắn là chuỗi nhị phân. Bỏ qua xét các kí tự phía sau luôn!

Xét lại nhé!

3 Likes

hàm kiểm tra: object A có phải là 1 chú hà mã

nếu số chân là 4 thì A là hà mã
trả về true
nếu số chân khác 4 thì A không phải là hà mã
trả về false

mình nghĩ hàm thứ 2 bao quát đủ case nên nó đúng :crazy_face::crazy_face::crazy_face:

4 Likes

Chắc là em ghi thiếu ở phần text dưới đó ạ.

Ý là nếu như sử dụng == thì nó không kiểm tra cả chuỗi mà chỉ đến cái thành phần nào có ‘0’ hoặc ‘1’ là nó trả về true luôn, không cần biết những cái khác ạ?

Cụt chân thì sao? :smiley:

Bài này soi từng kí tự nên equal() không tham gia.

Đề bài: Các kí tự đều là ‘0’ hay ‘1’
Bạn: Có (một) kí tự là ‘0’ hay ‘1’

4 Likes

:crazy_face:
không biết nói gì nữa luôn @rogp10

1 Like

hic, giờ thì thông suốt rồi ạ. cảm ơn các tiền bối đã chỉ dạy ạ :pray::pray::pray::pray:

em cứ thắc mắc hoài sao lại không được sử dụng == mấy ngày nay :frowning:

Đúng thế rồi!
Nếu chỉ thấy có '0' hoặc '1' mà bỏ qua các kí tự phía sau thì:

"1 con mèo" // true

Chỉ thấy có '1' là đã khẳng định đúng rồi, bỏ qua " con mèo" (sai) luôn.

4 Likes

em cảm ơn ạ, giờ thông suốt triệt để :sweat_smile::sweat_smile:

return Arrays.stream(zahl.toCharArray()).allMatch(c -> c == '0' || c == '1');
2 Likes

Dòng số 13 khi bạn lấy ra giá trị
char temp = zahl.charAt(i);
thì temp là biến kiểu nguyên thủy nên nó không có phương thức .equals(), nếu muốn sử dụng phương thức này bạn chỉ cần chỉnh lại
Character temp = zahl.charAt(i);
rồi dùng bình thường
System.out.println(temp.equals('1'));
Nhưng vấn đề ở đây là code sai :v Phải là nếu có 1 vị trí nào đó trong chuỗi khác 01 thì nó không phải là dãy nhị phân. Còn sửa lại thế nào thì ở trên có mấy bạn hướng dẫn rồi.

1 Like

Thao tác/kiểm tra giá trị với mảng thì em coi có 2 kĩ thuật cơ bản là kỹ thuật lính canhcờ hiệu, học 2 cái đó để áp dụng cho mấy bài toàn về sau hé.

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