[java] 문자열 비교에서 대소 문자를 구분하지 않게하려면 어떻게해야합니까?

두 문자열을 비교하는 Java 프로그램을 만들었습니다.

String s1 = "Hello";
String s2 = "hello";

if (s1.equals(s2)) {
    System.out.println("hai");
} else {
    System.out.println("welcome");
}

“환영”이 표시됩니다. 대소 문자를 구분한다는 것을 이해합니다. 하지만 내 문제는 대소 문자를 구분하지 않고 두 문자열을 비교하고 싶다는 것입니다. 즉, 출력이 hai.



답변

  • 가장 좋은 방법은 다음을 사용하는 것입니다 s1.equalsIgnoreCase(s2). ( javadoc 참조 )
  • 둘 다 대 / 소문자로 변환하여 사용할 수도 있습니다. s1.equals(s2)

답변

사용 String.equalsIgnoreCase().

Java API 참조를 사용하여 다음과 같은 답변을 찾으십시오.

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)

https://docs.oracle.com/javase/1.5.0/docs/api/


답변

String.equalsIgnoreCase 대소 문자를 구분하지 않는 순진한 문자열 비교를위한 가장 실용적인 선택입니다.

그러나이 메서드는 전체 대 / 소문자 접기 나 분해를 수행하지 않으므로 유니 코드 표준에 지정된대로 대 / 소문자 없는 일치를 수행 할 수 없다는 점을 알아 두는 것이 좋습니다 . 실제로 JDK API는 대소 문자 구분 문자 데이터에 대한 정보에 대한 액세스를 제공하지 않으므로이 작업은 시도되고 테스트 된 타사 라이브러리에 위임하는 것이 가장 좋습니다.

해당 라이브러리는 ICU 이며 대소 문자를 구분하지 않는 문자열 비교를위한 유틸리티를 구현하는 방법은 다음과 같습니다.

import com.ibm.icu.text.Normalizer2;

// ...

public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
    Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
    return normalizer.normalize(s).equals(normalizer.normalize(t));
}
    String brook = "flu\u0308ßchen";
    String BROOK = "FLÜSSCHEN";

    assert equalsIgnoreCase(brook, BROOK);

String.equalsIgnoreCase, 또는 String.equals대문자 또는 소문자 문자열에 대한 순진한 비교는 이 간단한 테스트에서도 실패합니다.

(사전 정의 된 대소 문자 접기 유형 getNFKCCasefoldInstance은 로케일과 무관합니다. 터키어 로케일의 경우 약간 더 많은 작업 UCharacter.foldCase이 필요할 수 있습니다.)


답변

개체 의 compareToIgnoreCase방법 을 사용해야 String합니다.

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0)그것은 str1같음 을 의미 str2합니다.


답변

import java.lang.String; //contains equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";

if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}

이제 다음과 같이 출력됩니다. hai


답변

기본 Java API에는 다음이 있습니다.

String.CASE_INSENSITIVE_ORDER

따라서 Sorted 데이터 구조가있는 문자열을 사용하는 경우 비교기를 다시 작성할 필요가 없습니다.

String s = "some text here";
s.equalsIgnoreCase("Some text here");

자신의 코드에서 순수한 동등성 검사를 원하는 것입니다.

Java에서 Strings의 동등성과 관련된 모든 것에 대한 추가 정보입니다. java.lang.String 클래스의 hashCode () 함수는 “대소 문자를 구분합니다”:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

따라서 문자열과 함께 Hashtable / HashMap을 키로 사용하고 “SomeKey”, “SOMEKEY”및 “somekey”와 같은 키를 동일하게 표시하려면 문자열을 다른 클래스로 래핑해야합니다 (확장 할 수 없음). 최종 클래스이므로 문자열). 예 :

private static class HashWrap {
    private final String value;
    private final int hash;

    public String get() {
        return value;
    }

    private HashWrap(String value) {
        this.value = value;
        String lc = value.toLowerCase();
        this.hash = lc.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o instanceof HashWrap) {
            HashWrap that = (HashWrap) o;
            return value.equalsIgnoreCase(that.value);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return this.hash;
    }
}

그런 다음 다음과 같이 사용하십시오.

HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();


답변

.equals 또는 .equalsIgnoreCase를 수행하기 전에 null 검사를 수행 할 수도 있습니다.

null String 개체는 equals 메서드를 호출 할 수 없습니다.

즉 :

public boolean areStringsSame(String str1, String str2)
{
    if (str1 == null && str2 == null)
        return true;
    if (str1 == null || str2 == null)
        return false;

    return str1.equalsIgnoreCase(str2);
}