지도를 가질 수있는 좋은 방법이 있습니까? 사건을 무시하고 넣어?
이 질문에 이미 답변이 있습니다.
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에 관한 다른 답변을 참조하십시오.
아래 링크에서 수락 된 답변을 확인하십시오. 케이스에 관계없이 맵에서 키를 확인하는 방법은 무엇입니까?
결론은 "가장 간단한 해결책은 삽입 / 확인하기 전에 모든 입력을 대문자 (또는 소문자)로 변환하는 것입니다. 일관성을 보장하기 위해이 작업을 수행하는 자체 맵 래퍼를 작성할 수도 있습니다."
'IT TIP' 카테고리의 다른 글
C #이 const 변수를 해당 값으로 바꾸는 것을 중지하는 방법은 무엇입니까? (0) | 2020.11.29 |
---|---|
org.eclipse.jetty : jetty-maven-plugin으로 서버 포트를 설정하는 방법은 무엇입니까? (0) | 2020.11.29 |
list :: size () 정말 O (n)입니까? (0) | 2020.11.29 |
Rails에서 슬러그 (사람이 읽을 수있는 ID)를 생성하는 가장 좋은 방법 (0) | 2020.11.28 |
세미콜론이없고 IF / WHILE / FOR 문이없는 C의 hello world (0) | 2020.11.28 |