将字符串与哈希图中的键值进行比较时忽略大小写

Ignore case while comparing string with keyvalue in the 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());
  }

任何帮助将不胜感激!!!

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

使用 string.toUpperCase() 或 string.toLowerCase() 忽略大小写。

只使用小写键:

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

可以循环遍历map的keySet,对于每个key,使用字符串函数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;
        }
    }

您也可以尝试使用 TreeMap,它可以为其构造函数提供一个比较器:

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

Case insensitive string as HashMap key

您可以使用 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")map.put("One", "One") 覆盖值插入。

map.get(null) returns "Three".

map.get("ONE")map.get("one")map.get("One") 等等 returns "Four".

请记住 keySet() 方法 returns 所有小写键或空值。

keySet() 等于 {"one", "two", null}.

Further documentation

如果您看到 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