Игнорировать регистр при сравнении строки с 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 () игнорировать регистр.