检查 2 个不区分大小写的字符串或使用 equalsIgnoreCase 方法

Check 2 strings without case sensitivity or use equalsIgnoreCase method

我有一些输入的字符串 String usrInput; 用户可以将一些字符串一次性导入到 App 中而无需任何区分大小写的策略,例如:“start”,“Start”,“START”,“end”,“END” " 等等

我有一个地图,我将我的字符串(例如“开始”)插入其中并将其放入 HashMap<String, String> myMap:

Map<String, String> listOfActions = new HashMap<>();
listOfActions.put(myStr, myStr);

现在我想检查 listOfActions 成员以在每个案例模型中获取例如“开始”(“开始”,“开始”,“START”),目前我喜欢以下内容:

if (listOfActions.containsKey(usrInput.toUpperCase())
        || listOfActions.containsKey(usrInput.toLowerCase())) {
    /// some do
}

所以我想知道:

1. 有什么方法可以不区分大小写地获取字符串值吗? 我也会在这里添加这个我不能使用 equalsIgnoreCase() 方法从 Map 获取项目,因为它 return Boolean.

2. 我在 switch-case 语句中有类似的问题来检查 2 个不区分大小写的字符串是否相等。

如果您只使用输入作为映射键(即您以后不需要在原始大小写中复制字符串),我建议在将它们插入映射之前将所有输入小写:

Map<String, String> listOfActions = new HashMap<>();
listOfActions.put(myStr.toLowerCase(), myStr);

这将简化以后查找值的过程,因为您知道所有键都已小写,因此查找变得容易:

if (listOfActions.containsKey(myStr.toLowerCase())) {
  // do something
}

您可以使用

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

其他解决方案可以是 Apache 的 CaseInsensitiveMap 或 Spring 的 LinkedCaseInsensitiveMap。

有关这些解决方案的更多详细信息,请参阅 https://www.baeldung.com/java-map-with-case-insensitive-keys

您可以做的一件事是将所有内容设为大写或小写,然后进行比较。

string.toLowerCase().equals("other string");
string.toUpperCase().equals("OTHERSTRING");

这样一来,无论是小写还是大写,都只会作为一个或另一个进行比较,就像不区分大小写一样。

当您创建 HashMap 的新实例时,您可以 覆盖 它的一些方法,例如 putcontainsKey 之类的这个:

Map<String, String> map = new HashMap<>() {
    @Override
    public String put(String key, String value) {
        return super.put(key.toLowerCase(), value);
    }
    @Override
    public boolean containsKey(Object key) {
        return super.containsKey(key.toString().toLowerCase());
    }
};

map.put("START", "doStart");

System.out.println(map); // {start=doStart}

System.out.println(map.containsKey("START")); // true
System.out.println(map.containsKey("Start")); // true
System.out.println(map.containsKey("start")); // true