두 문자열을 비교하는 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/
답변
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);
}