IT TIP

지도를 가질 수있는 좋은 방법이 있습니까?

itqueen 2020. 11. 29. 12:45
반응형

지도를 가질 수있는 좋은 방법이 있습니까? 사건을 무시하고 넣어?


이 질문에 이미 답변이 있습니다.

Map<String, ?>케이스를 무시하고 넣을 수 있는 좋은 방법이 있습니까?


TreeMap은 Map을 확장하고 사용자 지정 비교기를 지원합니다.

문자열은 대소 문자를 구분하지 않는 기본 비교기를 제공합니다.

그래서:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

비교기는 로케일을 고려하지 않습니다. JavaDoc에서 자세한 내용을 읽어보십시오.


Apache의 Commons Collections에서 CaseInsensitiveMap사용할 수 있습니다 .


Put / get 메서드를 재정의하는 자체 Map을 구현할 수 있습니까?

public class CaseInsensitiveMap extends HashMap<String, String> {
    ...
    put(String key, String value) {
       super.put(key.toLowerCase(), value);
    }

    get(String key) {
       super.get(key.toLowercase());
    }
}

이 접근 방식은 "키"유형을 강제로 변경하지 않고 맵 구현을 변경하도록합니다.


대소 문자를 구분하지 않는 equals () 및 hashCode () 구현이있는 String 키에 대한 래퍼 클래스가 필요합니다. Map의 키에 문자열 대신 사용하십시오.

http://www.java.happycodings.com/Java_Util_Package/code3.html 에서 구현 예를 참조하십시오 . 인터넷 검색에서 2 분 만에 찾았습니다. 나는 그것을 사용한 적이 없지만 나에게는 현명 해 보인다.


떠오르는 세 가지 분명한 솔루션 :

  • 문자열을 키로 사용하기 전에 대소 문자를 정규화하십시오 (터키어 로케일이 다른 국가와 다르게 작동하지 않음).

  • 키로 사용하도록 설계된 특수 오브젝트 유형을 사용하십시오. 이것은 복합 키를 다루는 일반적인 관용구입니다.

  • 대소 문자를 구분하지 않는 비교기와 함께 TreeMap을 사용하십시오 (아마도 PRIMARY 또는 SECONDARY 강도 java.text.Collator). 불행히도 Java 라이브러리에는 hashCode / equals에 해당하는 Comparator가 없습니다.


여기에 설명 된 Apache 라이선스 CaseInsensitiveMap을 사용할 수 있습니다 . Apache Commons 버전과 달리 키의 대소 문자를 유지합니다. TreeMap보다 더 엄격하게 맵 계약을 구현합니다 (더 나은 동시 의미 체계가 있음) (자세한 내용은 블로그 댓글 참조).


Trove4j 는 HashMap에 커스텀 해싱을 사용할 수 있습니다. 그러나 이것은 해시 코드를 캐시 할 수 없다는 점을 감안할 때 성능에 영향을 미칠 수 있습니다 (Trove4j가이 문제를 해결할 수있는 방법을 찾았을 수도 있지만). 래퍼 개체 (John M이 설명한대로)에는 이러한 캐싱 결함이 없습니다. 또한 TreeMap에 관한 다른 답변을 참조하십시오.


아래 링크에서 수락 된 답변을 확인하십시오. 케이스에 관계없이 맵에서 키를 확인하는 방법은 무엇입니까?

결론은 "가장 간단한 해결책은 삽입 / 확인하기 전에 모든 입력을 대문자 (또는 소문자)로 변환하는 것입니다. 일관성을 보장하기 위해이 작업을 수행하는 자체 맵 래퍼를 작성할 수도 있습니다."

참고 URL : https://stackoverflow.com/questions/212562/is-there-a-good-way-to-have-a-mapstring-get-and-put-ignoring-case

반응형