【问题标题】:Java : Using wildcard (*) for a key of HashMap [duplicate]Java:使用通配符(*)作为HashMap的键[重复]
【发布时间】:2015-10-13 00:42:03
【问题描述】:

我想做的是创建一个HashMap,看起来像这样。

我假设通配符 * 可以用作键,所以如果搜索除 abc(假设为 x)以外的任何字符,此 HashMap 将返回10

 for (int j = 0; j <= 2; j++) {            
        table.put(pattern[j], (pattern.length - 1 - j)); 
        //This part is actually not the same as the original code.
        //The keys are a,b,c, and the values are 1,2,3 respectively     
    }
    table.put('*', 10);

但是,当我在此映射中搜索键 x 时,会返回 null,因此很明显 * 不能直接用作通配符键。我关注了this page,但显然这不适用于 HashMap。

如果您能提供解决此问题的任何见解,我将不胜感激。

【问题讨论】:

  • 子类HashMap 让它做你想做的事,即。给定一个未显式映射的值,返回 10
  • * 字符在 HashMaps 中并不特殊。 HashMaps only 对它们的键的 hashCode 和相等性进行操作——没有其他魔法(除了null,我猜,它在特殊情况下只等于它自己)。没有理由让* 充当通配符,而不是让w 充当通配符。
  • @SotiriosDelimanolis 但这会破坏Map 的合同。
  • @PaulBoddington Nah,请澄清这个新类的规范中的行为。

标签: java hashmap


【解决方案1】:

Java 1.8 支持 getOrDefault

所以你可以使用 map.getOrDefault(key,defaultValue)

【讨论】:

  • 谢谢您的建议,但显然没有可以设置默认值的方法,是吗?
  • 我正在阅读这篇文章 (docs.oracle.com/javase/8/docs/api/java/util/…)
  • 如果没有这样的方法,我会覆盖getOrdefault(key,defaultValue),以便我可以设置默认值。您如何看待这个想法?
  • 你可以这样做。但我认为更好的设计是将默认值作为属性放在使用地图的类中
  • 非常感谢。我觉得我从中学到了很多。
【解决方案2】:

最好单独处理,而不是创建一个新的 Map 类。 你可以用一些包装类做这样的事情:

public Object getWithDefault(key){
    if (hashMap.get(key) == null){
        return hashMap.get("*");
    }
}

然后用包装类调用它

wrapper.getWithDefault('d');  // returns 10.

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2014-11-17
    • 2021-10-15
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多