Игнорировать регистр при сравнении строки с keyvalue в hashmap

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

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());
  }

любая помощь будет высоко оценили!!!

6 ответов


если вы видите реализацию метода 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

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

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

посмотреть строка без учета регистра как ключ HashMap


вы можете использовать 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">

на самом деле map.put("one", "Four") перезаписывает значение insert с map.put("One", "One").

map.get(null) возвращает "три".

map.get("ONE"), map.get("one"), map.get("One") и так далее возвращает "четыре".

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

keySet() равна {"one", "two", null}.

дополнительные документы


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

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

вы можете цикл через keySet карты, для каждого ключа, использовать функцию string 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;
        }
    }

pref.containsKey(buffSB.toString().toLowerCase())

использовать строку.toUpperCase () или строка.toLowerCase () игнорировать регистр.