마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

equals로 값 동등한지 비교하기

0 추천

 

number_except는 (textView_number_except는 textView)

int number_except = Integer.parseInt(textView_number_except.getText().toString());

 

numberAdapter는 textView_number_except라는 textView에 숫자를 입력하고 화면에 있는 '저장'이라는 버튼을 눌렀을 때

recyclerView에 textView에 입력한 숫자들이 각각의 아이템뷰로 띄워질 때 사용되는 어뎁터입니다.

 

 

 

 

if (numberAdapter.getItemCount() != 0) {
    Log.d(TAG, "어뎁터에 아이템이 1개 이상 있습니다.");
    Log.d(TAG, "아이템 0번째 값은 : " + numberAdapter.getItem(0));
    Log.d(TAG, "number_except 값은 : " + number_except);

        if (numberAdapter.getItem(0).equals(number_except+"")) {
            Log.d(TAG, "새로 추가하는 제외 숫자가 현재 중복입니다.");

            AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
            builder.setTitle("주의");
            builder.setMessage("숫자를 이미 추가하였습니다.");
            builder.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();

                    Log.d(TAG, "새로 추가하는 제외 숫자가 현재 중복 메세지 전달완료");
                }
            });
            AlertDialog dialog = builder.create();
            dialog.show();

        }else{
            numberAdapter.addItem(new Number(String.valueOf(number_except)));
            recyclerView.setAdapter(numberAdapter);
            Log.d(TAG, "중복되지 않는 숫자 : " + number_except + " 추가 완료");

        }
}else if(numberAdapter.getItemCount() == 0){
    numberAdapter.addItem(new Number(String.valueOf(number_except)));
    recyclerView.setAdapter(numberAdapter);

    Log.d(TAG, "첫번째 값 : " + number_except + " recyclerView에 추가됨");

}

 

이 코드를 통해 textView_number_except에 입력하여 추가하려는 숫자가 첫번째로 입력했던 숫자와 일치할 때

첫번째 숫자와 동일함을 경고하기 위해 equals를 이용하여 코드를 작성하려는데

 

처음으로 textView_number_except에 10을 추가하면 else if(numberAdapter.getItemCount() == 0){---}이 실행되어 10이 추가되고,

또 다시 10을 추가했을 때 if(numberAdapter.getItemCount() != 0){---}이 실행되어 if(numberAdapter.getItem(0).equals(number_except+"")){---}이 실행되어야하는데

else{---}로 넘어가 10이 또 추가됩니다.

 

Log.d(TAG, "아이템 0번째 값은 : " + numberAdapter.getItem(0));
Log.d(TAG, "number_except 값은 : " + number_except);

에서도 아이템 0번째 값은 : 10,     number_except 값은 : 10으로 뜨는데 if(numberAdapter.getItem(0).equals(number_except+"")){---}이 실행되지 않습니다.

왜그러는지 알 수 있을까요?

 

 

 

 

 

 

 

 

 

 

 

 

 

쿠롱 (400 포인트) 님이 2022년 11월 16일 질문
이유는
numberAdapter.getItem(0).equals(number_except+"")
에서 Number 클래스와 String은 타입이 서로 다르므로 equals 비교하면 항상 false가 리턴됩니다.

numberAdapter.getItem(0).<string_member_field>.equals(number_except+"")
로 비교하셔야 할 것 같아요.
여기서 말씀하시는 <string_member_field>는 무엇인가요?
Number 클래스에 있는 멤버변수의 getter예요. 이름을 알 수 없어서 그렇게 표시한 거예요.

1개의 답변

0 추천

질문에 있는 아이템 검사같은 로직은 어댑터를 가지고 하지 마시고 어댑테에 제공되는 데이터를 가지고 하시는게 코드를 파악하기도 좋고 관리하기에 도 더 좋습니다.

문자열을 숫자로 변환할 유틸리티 추가.

public class NunberUtils {
     public static Integer parseIntOrNull(String value) {
         try {
             return Integer.parseInt(value);
         } catch (NumberFormatException e) {
            return null;
        }
     }
}

 

액티비티

private List<Number> adpaterItems = new ArrayList<>();

private void performAddAdapterItem(String input) {
      if (!isValidInput(nput)) {
          showError("에레메세지");
          return;
      }

      addAdapterItem(input);
}

private boolean isValidInput(String input) {
     // 숫자포맷이 아니면 false
     Integer inputAsInt = NumberUtils.parseIntOrNull(input);
     if (inputAsInt == null) return false;

     // 아이테이 없는 경우.
     if (adapterItems.isEmpty()) return true;

     // 첫번째 아이템과 같지 않아야 함.
     return !adapterItems.get(0).value.equals(input);
}

private void addAdapterItem(String s) {
    adapterItems.add(new Number(s));
    numberAdapter.setItems(adapterItems); // setItems가 notifyDataSetChanged를 호출할 것.
}

 

spark (227,530 포인트) 님이 2022년 11월 16일 답변
spark님이 2022년 11월 16일 수정
...