【问题标题】:Extending TreeMap to only take Integer -> Integer mappings?将 TreeMap 扩展为仅采用 Integer -> Integer 映射?
【发布时间】:2013-06-20 17:42:38
【问题描述】:

我想创建一个类,它是TreeMap 的扩展类,它只能将整数映射到整数。有没有比简单地将所有内容都转换为 Integer 更好的方法来做到这一点?

【问题讨论】:

    标签: java data-structures treemap


    【解决方案1】:

    尝试将你的类声明为

    class MyTreeMap extends TreeMap<Integer, Integer> {
    

    注意MyTreeMap 没有任何类型参数,因为我们知道我们只想处理Integers。

    【讨论】:

    • 我真的不明白这样做的意义。好的 Ryan Yu 以这种方式陈述了这个问题,但这个问题并没有给出额外的理由来这样做,而不仅仅是使用泛型,只要没有额外的理由我就不会创建子类。我会推荐 Matt Balls 的答案。
    • @cproinger 这样做是有原因的……如果你想改变TreeMap的功能的某些方面,或者让它实现另一个接口。在不了解 OP 的困境的情况下,您不能认为这是毫无意义的。
    • 当然。但问题中没有。更改 TreeMap 功能的某些方面可能会破坏 TreeMap 的语义,但 MyTreeMap 仍然可以分配给 TreeMap ......好吧,我并不是想说它通常是错误的,但根据我的经验,更多时候不是你在射击自己通过从集合类扩展脚(问题中没有足够的上下文来了解,但请考虑是否要使用休眠来持久化对象)。
    • 是的,我会解释一下,我想:我试图映射容器的大小 -> 该大小的出现次数,但想在操作方面添加一些额外的功能k/v 对(即 pollAndDecrementLastKey,它减少了 containerSize 的计数。)为了实现这个类,我想将这些对中的键和值限制为整数。
    • 那么像 TreeMap?并发呢? Collections.synchronizedCollection(.) 不适用于子类。以这种方式封装似乎是更好的方法(就像 Woot4Moo 的回答,只是我不会通过实现+委派来公开整个地图界面,只是我需要的东西)
    【解决方案2】:

    您不需要扩展或强制转换任何内容。 Use generics:

    Map<Integer, Integer> foo = new TreeMap<Integer, Integer>();
    

    ...你就完成了。

    【讨论】:

    • 嗯,我认为这并不能真正回答 OP 的问题。您所做的是创建一个只能采用整数的 TreeMap 实例,您没有做的是创建一个只能采用整数的特定 TreeMap 数据结构。
    • @Woot4Moo 不确定我明白这一点,但足够公平。这感觉是非常前通用的集合。
    【解决方案3】:

    您可能要考虑的是像这样实现 Map 接口:

    class MyIntegerMap implements Map<Integer,Integer>  
    {  
         private TreeMap<Integer,Integer> internalTreeMap;  
         ...  
    
    
        public Integer put(Integer key, Integer value)  
         {  
              interalTreeMap.put(key,value);
         }  
    }  
    

    这样做是允许您利用已经定义的 TreeMap 函数(避免手动滚动时的所有性能问题),并且允许您限制子类的有效输入类型。

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多