求思路, 需要做一个容器,容器内的元素既需要用上list功能(用于排序),也需要用上Map功能(用于key快速搜索),请问一般大家是如何实现?我现在的做法是,在class内部同时封装了一个ArrayList对象及HashMap对象, 通过代码保证两个对象内的元素是一样的, 需要用上list功能时则调用ArrayList对象的方法,需要map功能则调用HashMap对象的方法.想找一个更好的方法,谢谢.

解决方案 »

  1.   

    答:TreeMap容器如何?既保持有序,又具有MAP的KEY功能.
      

  2.   

    你是一个 key 对应一个 List?那排序排什么呢?
      

  3.   

    TreeMap出来的只是按key排序,并不完全具有list的功能, 并不是我想要的. 比如:有些时候我需要保留插入元素时的顺序, 在Map中没有这样的功能,TreeMap也只是按key来排序,原始顺序会打乱的.  还有另一种情况:就是list的排序,treemap只限于对key排序,也不够用.
      

  4.   


    查看了文档,似乎没有list的功能.
      

  5.   

    我有一个方法,不知行不行.用toArray把ArrayList转换成数组,然后再用HashMap对象的方法.比如: 
    List t = new ArrayList();
    t.toArray(T<> a);  Map m = new HashMap();
    m.put(key, vaule);     //key是查找的索引, vaule是数组的下标.
      

  6.   


    这个考虑过,但效率不行,每次元素改变都得ToArrayList一次. 或者说每次需要调用list功能时都要将map转换成list,这样效率太低
      

  7.   


    刚才看错了,以为你在说把map 转换成 arraylist
      

  8.   

    一个类是不可能同时实现 List 和 Map 接口的。实现的办法就是写一个新的类。
    http://blog.csdn.net/YidingHe/archive/2009/01/05/3711730.aspx
      

  9.   

    关注一下,
    treeMap:
    public class TreeMap<K,V>extends AbstractMap<K,V>implements SortedMap<K,V>, Cloneable, Serializable
    SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。此实现为 containsKey、get、put 和 remove 操作提供了保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的《Introduction to Algorithms》中的算法的改编。注意,如果有序映射要正确实现 Map 接口,则有序映射所保持的顺序(无论是否明确提供比较器)都必须保持与等号一致。(请参见与等号一致 的精确定义的 Comparable 或 Comparator。)这也是因为 Map 接口是按照等号操作定义的,但映射使用它的 compareTo(或 compare)方法对所有键进行比较,因此从有序映射的观点来看,此方法认为相等的两个键就是相等的。即使顺序与等号不一致,有序映射的行为仍然是 定义良好的;只不过没有遵守 Map 接口的常规约定。注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 保持外部同步。(结构上修改是指添加或删除一个或多个映射关系的操作;仅改变与现有键关联的值不是结构上的修改。)这一般通过对自然封装该映射的某个对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示:      Map m = Collections.synchronizedMap(new TreeMap(...));
     由所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。
      

  10.   


    这位朋友写的跟我原意差不多了,只是我后来因为觉得get与set方法都需要遍历list来寻找效率有点慢,所以在内部再用了一个map对象。 比如以下get函数,用for循环来遍历,效率不够好. 所以我才在内部再加一个map
    **
         * 通过键获得值
         *
         * @param key 键
         *
         * @return 值
         */
        public V get(K key) {
            for (Item item : values) {
                if (item.key.equals(key)) {
                    return item.value;
                }
            }
            return null;
        }
      

  11.   

    写个类封装2个list进去,一个存键,一个存值,按值排序
      

  12.   

    LinkedHashMap 看看Source