实现Map并保持插入顺序的Java类?
我正在寻找具有键-值关联但不使用哈希的Java类。 这是我目前正在做的事情:
- 将值添加到
Hashtable
。 - 获取
Hashtable.entrySet()
的迭代器。 - 遍历所有值和:
- 获取迭代器的
Map.Entry
。 - 根据该值创建类型为
Module
(自定义类)的对象。 - 将类添加到JPanel。
- 获取迭代器的
- 显示面板。
这样做的问题是我无法控制获取值的顺序,因此无法按给定顺序显示值(没有对顺序进行硬编码)。
我将为此使用ArrayList
或Vector
,但是稍后在代码中,我需要获取给定Key的Module
对象,而ArrayList
或Vector
无法做到这一点。
有谁知道一个免费的/开源的Java类可以做到这一点,还是一种基于值何时从Hashtable
获取值的方法?
谢谢!
#1楼
您可以尝试我的链接树图实现。
#2楼
如果一幅不变的地图符合您的需求,那么Google就有一个名为guava的图书馆(另请参阅guava问题 )
Guava提供了具有可靠的用户指定迭代顺序的ImmutableMap 。 该ImmutableMap对containsKey get具有O(1)性能。 显然不支持放置和删除。
ImmutableMap对象是使用优雅的静态便利方法of()和copyOf()或Builder对象构造的。
#3楼
当您遍历地图的keySet(),entrySet()或values()时,LinkedHashMap将按照插入地图的顺序返回元素。
Map<String, String> map = new LinkedHashMap<String, String>();map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());
}
这将按照将元素放入地图的顺序进行打印:
id = 1
name = rohan
age = 26
#4楼
每当我需要保持事物的自然顺序时,我都会使用EnumMap
键将是枚举,您可以按所需的任何顺序插入,但是当您进行迭代时,它将以枚举顺序(自然顺序)进行迭代。
同样,在使用EnumMap时,不应存在任何会更有效的冲突。
我真的发现使用enumMap可以使代码清晰可读。 这是一个例子
#5楼
您可以使用LinkedHashMap来映射Map中的主要插入顺序
关于Java LinkedHashMap类的要点是:
- 它仅包含唯一元素。
LinkedHashMap包含基于键3的值。它可以具有一个null键和多个null值。 4,与HashMap相同,但保持插入顺序
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
但是,如果要使用用户定义的对象或任何原始数据类型键在地图中对值进行排序,则应使用TreeMap。有关更多信息,请参考此链接
#6楼
您可以使用LinkedHashMap<K, V>
,也可以实现自己的CustomMap ,以维护插入顺序。
您可以将以下CustomHashMap
与以下功能一起使用:
- 通过内部使用LinkedHashMap可以维护插入顺序。
- 用钥匙
null
或空字符串是不允许的。 - 创建具有值的键后,我们不会覆盖其值。
HashMap
vs LinkedHashMap
vs CustomHashMap
interface CustomMap<K, V> extends Map<K, V> {public boolean insertionRule(K key, V value);
}@SuppressWarnings({ "rawtypes", "unchecked" })
public class CustomHashMap<K, V> implements CustomMap<K, V> {private Map<K, V> entryMap;// SET: Adds the specified element to this set if it is not already present.private Set<K> entrySet;public CustomHashMap() {super();entryMap = new LinkedHashMap<K, V>();entrySet = new HashSet();}@Overridepublic boolean insertionRule(K key, V value) {// KEY as null and EMPTY String is not allowed.if (key == null || (key instanceof String && ((String) key).trim().equals("") ) ) {return false;}// If key already available then, we are not overriding its value.if (entrySet.contains(key)) { // Then override its value, but we are not allowingreturn false;} else { // Add the entryentrySet.add(key);entryMap.put(key, value);return true;}}public V put(K key, V value) {V oldValue = entryMap.get(key);insertionRule(key, value);return oldValue;}public void putAll(Map<? extends K, ? extends V> t) {for (Iterator i = t.keySet().iterator(); i.hasNext();) {K key = (K) i.next();insertionRule(key, t.get(key));}}public void clear() {entryMap.clear();entrySet.clear();}public boolean containsKey(Object key) {return entryMap.containsKey(key);}public boolean containsValue(Object value) {return entryMap.containsValue(value);}public Set entrySet() {return entryMap.entrySet();}public boolean equals(Object o) {return entryMap.equals(o);}public V get(Object key) {return entryMap.get(key);}public int hashCode() {return entryMap.hashCode();}public boolean isEmpty() {return entryMap.isEmpty();}public Set keySet() {return entrySet;}public V remove(Object key) {entrySet.remove(key);return entryMap.remove(key);}public int size() {return entryMap.size();}public Collection values() {return entryMap.values();}
}
CustomHashMap
用法:
public static void main(String[] args) {System.out.println("== LinkedHashMap ==");Map<Object, String> map2 = new LinkedHashMap<Object, String>();addData(map2);System.out.println("== CustomHashMap ==");Map<Object, String> map = new CustomHashMap<Object, String>();addData(map);
}
public static void addData(Map<Object, String> map) {map.put(null, "1");map.put("name", "Yash");map.put("1", "1 - Str");map.put("1", "2 - Str"); // Overriding valuemap.put("", "1"); // Empty Stringmap.put(" ", "1"); // Empty Stringmap.put(1, "Int");map.put(null, "2"); // Nullfor (Map.Entry<Object, String> entry : map.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}
}
O / P:
== LinkedHashMap == | == CustomHashMap ==
null = 2 | name = Yash
name = Yash | 1 = 1 - Str
1 = 2 - Str | 1 = Int= 1 |= 1 |
1 = Int |
如果您知道KEY是固定的,则可以使用EnumMap。 从属性/ XML文件获取值
例如:
enum ORACLE {IP, URL, USER_NAME, PASSWORD, DB_Name;
}EnumMap<ORACLE, String> props = new EnumMap<ORACLE, String>(ORACLE.class);
props.put(ORACLE.IP, "127.0.0.1");
props.put(ORACLE.URL, "...");
props.put(ORACLE.USER_NAME, "Scott");
props.put(ORACLE.PASSWORD, "Tiget");
props.put(ORACLE.DB_Name, "MyDB");
#7楼
我建议使用LinkedHashMap
或TreeMap
。 LinkedHashMap
保留键的插入顺序,而TreeMap
则通过Comparator
或元素的自然Comparable
顺序进行排序。
由于不必对元素进行排序,因此在大多数情况下, LinkedHashMap
应该更快。 根据Javadocs, TreeMap
的containsKey
, get
, put
和remove
性能为O(log n)
,而LinkedHashMap
的每种性能均为O(1)
。
如果您的API仅期望可预测的排序顺序,而不是特定的排序顺序,请考虑使用这两个类实现的接口NavigableMap
或SortedMap
。 这样一来,您就不会将特定的实现泄漏到您的API中,之后便可以随意切换到这些特定的类或完全不同的实现。
#8楼
我不知道它是否是开源的,但是经过一番谷歌搜索之后,我发现了使用ArrayList的Map实现 。 它似乎是Java 1.5之前的版本,因此您可能希望对其进行泛化,这应该很容易。 请注意,此实现具有O(N)访问权限,但是如果您不向JPanel添加数百个小部件,这也不是问题,无论如何都不应该这样做。
#9楼
您可以维护一个Map
(用于快速查找)和List
(用于顺序),但LinkedHashMap
可能是最简单的。 您也可以尝试使用SortedMap
例如TreeMap
,它具有您指定的任何顺序。
实现Map并保持插入顺序的Java类?相关推荐
- php键顺序初始化,Java类中各成员初始化的顺序
了解Java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println(&quo ...
- Java中Map类型数据使用LinkedHashMap保留数据的插入顺序
场景 Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式: Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式_BADAO_LIUMANG_QIZHI的博客-CSDN博 ...
- java把map值放入vector_Thinking in java基础之集合框架
Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...
- java数据结构实验一顺序表,java数据结构实验代码之升序顺序表
java数据结构实验代码之升序顺序表 数据结构实验报告 学院:管理学院 班级:13电子商务(1)班 姓名:廖秋君 学号:3213004779 2014年 10月 23 日 目录 一.需求分析----- ...
- java顺序结构类型,Java类的完整构造执行顺序
这里只说一个完整的结果,至于为什么是这样的顺序,可以参考我以前的文章:深入剖析java类的构造方式 如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块 如果类有静态成员赋值或者静态 ...
- java类集(List/Set/Map/
java实现类集的包: java.util.*包 类集:动态对象数组(可以保存多个对象在一个数组之中)或链表 问题:数组长度不可改变,当需要向数组中增加数据的时候需要去考虑对象数组的容量 Collec ...
- C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)
1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...
- Java类和对象的初始化顺序
本文摘录于http://blog.csdn.net/socoolfj/archive/2006/05/23/750425.aspx,并修改例子的代码,加上自己的见解. 类装载步骤 在Java中,类装载 ...
- java类的运行顺序_Java语言类的基本运行顺序
本文主要向大家介绍了Java语言类的基本运行顺序,通过具体的代码向大家展示,希望对大家学习Java语言有所帮助.我们以下面的类来说明一个基本的 Java 类的运行顺序:1. public class ...
最新文章
- java,UDP协议简单实现
- CONVERT_DATE_INPUT
- 837. New 21 Game
- centos7 安装SSH
- P5180-[模板]支配树
- 导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃
- EISCONN的故事
- Angular国际化方案
- dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)...
- Ubuntu系统日志分析
- sklearn中的xgboost_RF/GBDT/XGBoost/LightGBM简单总结
- 百度换肤怎么实现的html,JavaScript 实现百度换肤功能
- vue实现点击按钮“查看详情”弹窗展示详情列表
- java做界面_java怎么做出界面?实例讲解
- 如何使用群发工具?邮件群发软件免费有哪些?
- 贝塞尔曲线(Bezier)之 QQ 消息拖拽动画效果
- 关于NBMA网络基于RIP、HDLC、PPP,MGRE环境下实现所有PC互通
- Fedora Project, extras 目录(进入小心)
- apache 问题 You don't have permission to access /test.php on this server 解决方法
- 信息编码--区位码,国标码,内码
热门文章
- 算法-------寻找旋转排序数组中的最小值
- Android 修改手机hosts域名 (绑定host域名 )
- Android GLSurfaceView.Renderer 类 onDrawFrame 方法的刷新机制
- Apache MINA 2.0 用户指南
- android studio 如何提示方法的用法
- linux各目录的文件大小,Linux下查看文件大小和目录大小以及目录下文件的大小...
- 【Java并发编程】并发容器之CopyOnWriteArrayList
- 图片加载利器Picasso 解析
- 关于防范csrf攻击基于token鉴权
- python爬虫学习(三):使用re库爬取淘宝商品,并把结果写进txt文件