在java中选择用值列表组织数据的数据结构

在java中选择用值列表组织数据的数据结构,java,data-structures,Java,Data Structures,我有一个地图,如下图所示,其中有一个键,值的类型为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")) 如上所示,只向映射引入

我有一个地图,如下图所示,其中有一个键,值的类型为
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"))
如上所示,只向映射引入了一个新键,其值为上一个映射

因此,它就像一个
Map
whis成为一个复杂的数据结构,我可以将数据结构组织为 例如,一个类包含一个映射,因此

Map<B1 , RtyName>
Map<B2 ,rtyRate>
因此,在上述结构中,复杂性将较低,因为在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
final Table values=HashBasedTable.create();
value.put(“B1”、“RtyName”、list.newArrayList(“weep n”、“weep fnb”、“eedgeft”、“xbteyy”);
System.out.println(values.get(“B1”、“RtyName”);//打印列表
我的目标是,我可以拥有的任何数据结构中,与B1相比,我将获得Rtyname,对于Rtyname,我将获得可能的值列表

我将这样做:

Map<Integer, List<String>> dataMap = new HashMap<>();
dataMap.put("B1".hashCode()+"RtyName".hashCode(), Arrays.asList("weepn", "weepfnb", "eedgeft", "xbteehy"));
dataMap.put("B1".hashCode()+"rtyRate".hashCode(), Arrays.asList("deed", "ww", "terrty", "hteetyure"));
dataMap.put("B2".hashCode()+"RtyName".hashCode(), Arrays.asList("SSSweepn", "wpefSSSnb", "GGeGdgeft", "xbteYYYYhy"));
dataMap.put("B2".hashCode()+"rtyRate".hashCode(), Arrays.asList("WWded", "wTeTYw", "YYYYtrerty", "IIIehttyure"));
请注意,
hashCode
只是
String
类中的一个方便函数,可以满足我的需要。如果您愿意,您可以使用自己的滚动键返回
字符串
键(或者其他任何键)

实际上,由于您原来的方法不需要与顺序无关的函数,您甚至可以将
字符串
键串联起来用作新键:

dataMap.put("B1"+"RtyName", Arrays.asList(/*your list here*/));
与第一种方法相比,这种方法不太方便(在编程上也不太“好”),但仍然比嵌套
Map
类要好得多。(与hashCode相比,在输出时更容易识别键)

双向映射 值作为键 如果希望每个
列表
值都映射到键,或者反过来映射到键,则需要第二个
映射

Map<List<String>, String> valueMap = new HashMap<>(); //New map for value->key 
for(String key: dataMap.keySet()) //Get all keys
    valueMap.put(dataMap.get(key), key); //Create mapping value->key
Map<String, String> itemMap = new HashMap<>(); //New map for item->key mapping
    for(String key: dataMap.keySet()) //Get all keys and iterate through
        for(String item: dataMap.get(key)) //For each item in your value list
            itemMap.put(item, key); //Create new mapping item->key
正如你所要求的:

在本例中,您只需定义一个类,
ABC
,正如您所建议的那样,它包含两个列表,
RtyName
rtyRate
列表:

public class ABC {
    private List<String> RtyName;
    private List<String> rtyRate;

    public ABC(List<String> RtyName, List<String> rtyRate) {
        setRtyNames(RtyName);
        setRtyRates(rtyRate);
    }

    public void setRtyNames(List<String> RtyName) {
        this.RtyName = RtyName;
    }

    public List<String> getRtyNames() {
        return this.RtyName;
    }

    public void setRtyRates(List<String> rtyRate) {
        this.rtyRate = rtyRate;
    }

    public List<String> getRtyRates() {
        return this.rtyRate;
    }
}
现在只需调用
get(String)
即可检索条目,就像您以前所做的那样:

ABC data = newdatamap.get("B1);
您还可以直接检索其中一个列表,如:

List<String> RtyNames = newdatamap.get("B1").getRtyNames();
如果现在将ABC更改为仅包含一个RtyEntry对象列表,如下所示:

public class ABC {
    private List<RtyEntry> rtyEntries;

    public ABC(List<RtyEntry> rtyEntries) {
        this.rtyEntries = rtyEntries;
    }

    public ABC() {
        this.rtyEntries = new ArrayList<>();
    }

    public void setRtyEntries(List<RtyEntry> rtyEntries) {
        this.rtyEntries = rtyEntries;
    }

    public List<RtyEntry> getRtyEntries() {
        return this.rtyEntries;
    }

    // convenience methods

    public void addRtyEntry(RtyEntry entry) {
        this.rtyEntries.add(entry);
    }
}
检索条目也更改为重构:

ABC data = newdatamap.get("B1");
List<RtyEntry> entries = data.getRtyEntries();
for (RtyEntry entry : entries) {
    System.out.println(entry.getName() + " has a rate of: " + entry.getRate());
}
ABC data=newdatamap.get(“B1”);
列表条目=data.getRtyEntries();
对于(RtyEntry条目:条目){
System.out.println(entry.getName()+”的速率为:“+entry.getRate());
}
当然,您也可以通过以下方式直接检索列表:

List<RtyEntry> entries = newdatamap.get("B1").getRtyEntries();
List entries=newdatamap.get(“B1”).getRtyEntries();

与以前一样。

为什么不声明一个简单的POJO,其中包含
Rtyname
rtyRate
的两个列表,并将该类的对象放入映射中,而不是嵌套映射和列表?这似乎是合理的。除了复杂性,还有什么值得关注的?您是否需要在不知道B1或B2密钥的情况下访问成员?考虑使用<代码> EnUM <代码>代替<代码>字符串 >当您有一组已知值以选择数据结构时,请先写下要求,尤其是插入、删除的形式,上一个示例建议您只需要可以使用两个标识符/键组合引用的列表。如果是这种情况(是这样吗?),最好使用一个函数,该函数以散列函数的方式基于这两个值生成密钥(并且与顺序无关),然后只需使用此函数引用单个
Map@ROmanvottner能否请您展示一下,假设创建了一个名为ABC的pojo,创建了两个Rtyname和rtyRAte列表,那么我将如何管理评论不用于扩展讨论;这段对话已经结束。
newdatamap.put("B2", new ABC(Arrays.asList("SSSweepn", "wpefSSSnb", "GGeGdgeft", "xbteYYYYhy"), 
                             Arrays.asList("WWded", "wTeTYw", "YYYYtrerty", "IIIehttyure"));
ABC data = newdatamap.get("B1);
List<String> RtyNames = newdatamap.get("B1").getRtyNames();
public class RtyEntry {
    private String name;
    private String rate;

    public RtyEntry(String name, String rate) {
        setName(name);
        setRate(rate);
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setRate(String rate) {
        this.rate = rate;
    }

    public String getRate() {
        return this.rate;
    }
}
public class ABC {
    private List<RtyEntry> rtyEntries;

    public ABC(List<RtyEntry> rtyEntries) {
        this.rtyEntries = rtyEntries;
    }

    public ABC() {
        this.rtyEntries = new ArrayList<>();
    }

    public void setRtyEntries(List<RtyEntry> rtyEntries) {
        this.rtyEntries = rtyEntries;
    }

    public List<RtyEntry> getRtyEntries() {
        return this.rtyEntries;
    }

    // convenience methods

    public void addRtyEntry(RtyEntry entry) {
        this.rtyEntries.add(entry);
    }
}
RtyEntry entry1 = new RtyEntry("wpn", "dd");
List<RtyEntry> entries = Arrays.asList(entry1, ...);
newdatamap.put("B1", new ABC(entries));
newdatamap.get("B1").addRtyEntry(new RtyEntry("wpfnb", "ww"));
ABC data = newdatamap.get("B1");
List<RtyEntry> entries = data.getRtyEntries();
for (RtyEntry entry : entries) {
    System.out.println(entry.getName() + " has a rate of: " + entry.getRate());
}
List<RtyEntry> entries = newdatamap.get("B1").getRtyEntries();