在java中选择用值列表组织数据的数据结构
我有一个如下所示的映射,其中有一个键,值的类型为List
:
Map<String, List<String> newdatamap = new HashMap<>();
map.put ("RtyName", Arrays.asList("wpn", "wpfnb", "dgeft", "xbthy"));
map.put ("rtyRate", Arrays.asList("dd", "ww", "trrty", "httyure"))
我想在前面的地图上再添加一个地图,这样就有一个键,它的值就是上面的地图。这是正确的数据结构吗?我们如何实现它
我想要如下所示的东西
Key Value
B1 RtyName ----> "weepn", "weepfnb", "eedgeft", "xbteehy"
rtyRate ----->"deed", "ww", "terrty", "hteetyure"
B2 RtyName ----> "SSSweepn", "wpefSSSnb", "GGeGdgeft", "xbteYYYYhy"
rtyRate ----->"WWded", "wTeTYw", "YYYYtrerty", "IIIehttyure"
如上所示,只向映射引入了一个新键,其值为上一个映射
因此,它就像一个Map<String, Map<String, List<String>>>
变成了一个复杂的数据结构,我可以将数据结构组织为
例如,一个类包含一个映射,因此
Map<B1 , RtyName>
Map<B2 ,rtyRate>
和付款人nae包含值列表,例如
RtyName ----> "SSSweepn", "wpefSSSnb", "GGeGdgeft", "xbteYYYYhy"
rtyRate ----->"deed", "ww", "terrty", "hteetyure"
因此,在上述结构中,复杂性将较低,因为在B1的末尾,我必须搜索将为RtyName的键,并根据付款人名称进一步搜索将为“wpn”、“wpfnb”、“dgeft”、“xbthy”的值
请告知什么样的地图是最好的,或者是否有其他更好的数据结构来获取此信息
我脑海中浮现的一个数据结构是番石榴表
final Table<String, String, List<String>> values = HashBasedTable.create();
values.put("B1", "RtyName", Lists.newArrayList("weepn", "weepfnb", "eedgeft", "xbteehy"));
System.out.println(values.get("B1", "RtyName")); // prints the list
我的目标是,我可以拥有的任何数据结构,对于B1,我将获得Rtyname,对于Rtyname,我将获得可能的值列表
# 1 楼答案
正如你所要求的:
您只需定义一个类
ABC
,在本例中,正如您所建议的那样,它包含两个列表RtyName
和rtyRate
列表:该类就绪后,可以将地图定义更改为:
并像之前一样为其分配新的值,而不是将这些列表嵌套在另一个映射中,并将此映射放入外部映射,而是创建一个新的ABC实例,提供两个列表作为输入参数,并将生成的ABC对象放入映射(正式称为外部映射):
您还可以将这些列表直接指定为输入参数:
现在只需调用
get(String)
即可检索条目,就像您以前所做的那样:您还可以直接检索其中一个列表,如:
在我看来,这是一种同时管理和阅读更容易的方式。除此之外,您还获得了运行时安全性,因为您不会遇到
RtyName
或rtyRate
的最终键入错误重新设计更新
如果
RtyName
项和rtyRate
项总是齐头并进,f.e.wpn
是名称,dd
是分配的速率,将这些字段组合在一起是有意义的。因此,您可以重构代码,进一步减少一个列表,并引入一个新类:如果现在将ABC更改为仅包含一个RtyEntry对象列表,如下所示:
现在,创建将更改为:
然后,您还可以分配如下新条目:
检索条目也更改为重构:
当然,您也可以通过以下方式直接检索列表:
和以前一样
# 2 楼答案
我会这样做:
这将代表:
注意
hashCode
只是String
类中的一个方便函数,可以满足我的需要。如果您愿意,您可以使用自己的滚动键返回String
键(或者其他任何键)实际上,由于您最初的方法不需要与顺序无关的函数,您甚至可以将
String
键串联起来用作新键:与第一种方法相比,这种方法不太方便(在编程上也不那么“好”),但仍然比嵌套
Map
类要好得多。(与hashCode
相比,在输出时,按键更容易识别。)双向映射
值作为键
如果希望每个
List
值映射到键,或者反过来映射到键,则需要第二个Map
:每个项目的价值都是一个键
如果希望
values
列表中的每个String
项都映射到keys
或者反过来映射,则需要第二个Map
: