2015-11-20 3 views
6

Я пытаюсь проверить, содержит ли мой набор ключей hashmap строку 'buffSB.toString()'. Но я хотел сравнить игнорирующее случай (верхний или нижний).Игнорировать случай при сравнении строки с ключом в hashmap

static StringBuilder buffSB = new StringBuilder(); 

buffSB.append(alphabet); 

Map<String, String> pref = new Datamatch().main(); // Getting the Hashmap from other class 

if(pref.containsKey(buffSB.toString()))    //This is where I need to ignore case while searching string in the map key set 
    { 
     String val = pref.get(buffSB.toString()); 
    } 

Любая помощь будет принята с благодарностью!

ответ

1

Если вы видите реализацию метода HashMap GETKEY вы должны пройти соответствующий ключ для генерации хэш-значения и получить фактическое значение из этого ведра.

if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 

Три решения

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

ИЛИ

Map<String, String> map = new CaseInsensitiveMap<String, String>(); 

ИЛИ

Looping through map with the ignore case 
-1
pref.containsKey(buffSB.toString().toLowerCase()) 

Использование string.toUpperCase() или string.toLowerCase(), чтобы игнорировать регистр.

+1

, если прив содержит "Привет". что было бы результатом для «HELLO» или «hello»? –

1

использовать только строчные ключи:

map.put(key.toLowercase(), value); 
// later 
String val = map.get(someKey.toLowerCase()); 
+1

И если ему абсолютно нужны струны, чтобы иметь верхние и нижние челюсти? Как имена, например ... –

1

Вы можете цикл через keySet карты, для каждого ключа, используйте функцию строки equalsIgnoreCase для сравнения:

Map<String, String> pref = new Datamatch().main(); // Getting the Hashmap from other class 

    String val; 
    for (String key : pref.keySet()) { 
     if (key.equalsIgnoreCase(buffSB.toString())) { 
      val = pref.get(key); 
      break; 
     } 
    } 
2

Вы также можете попробовать используйте TreeMap, которые позволяют предоставлять компаратор своему конструктору:

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

см Case insensitive string as HashMap key

2

Вы можете использовать CaseInsensitiveMap<K,V> вместо Map<K,V>

Он расширяет AbstractHashedMap<K,V> и игнорирует регистр ключей. Вы можете создать новый экземпляр этой карты, передав существующую карту с учетом регистра конструктору.

Рассмотрим следующий пример:

Map<String, String> map = new CaseInsensitiveMap<String, String>(); 
map.put("One", "One"); 
map.put("Two", "Two"); 
map.put(null, "Three"); 
map.put("one", "Four"); 

карта будет содержит три элемента:

<one, "Four"> 
<two, "Two"> 
<null, "Three"> 

Infact map.put("one", "Four") перезаписывает вставку значения с map.put("One", "One").

map.get(null) возвращается «Три».

map.get("ONE"), map.get("one"), map.get("One") и т. Д. «Четыре».

Имейте в виду, что метод keySet() возвращает все строчные ключи или нули.

keySet() всего {"one", "two", null}.

Further documentation

Смежные вопросы