Map数据结构转换

孤好梦中杀人 2014-05-07 10:22:17

public static void main(String[] args)
{
Map<String, Map<String, List<String>>> maps = new HashMap<String, Map<String, List<String>>>();
Map<String, List<String>> m1 = new HashMap<String, List<String>>();
List<String> la = new ArrayList<>();
la.add("李世民");
la.add("李建成");
la.add("平西王");

List<String> lb = new ArrayList<>();
lb.add("秦叔宝");
lb.add("单雄信");
lb.add("平西王");

m1.put("早发白帝城", la);
m1.put("送孟浩然之广陵", lb);

Map<String, List<String>> m2 = new HashMap<String, List<String>>();

List<String> lc = new ArrayList<>();
lc.add("赵匡胤");
lc.add("朱元璋");
lc.add("李鸿章");

List<String> ld = new ArrayList<>();
ld.add("平西王");
ld.add("平南王");
ld.add("李建成");

m2.put("闻官军收河南河北", lc);
m2.put("石壕吏", ld);

maps.put("李白", m1);
maps.put("杜甫", m2);

System.out.println(maps);
}

数据结果为:
{李白={早发白帝城=[李世民, 李建成, 平西王], 送孟浩然之广陵=[秦叔宝, 单雄信, 平西王]}, 杜甫={闻官军收河南河北=[赵匡胤, 朱元璋, 李鸿章], 石壕吏=[平西王, 平南王, 李建成]}}

解释如下:
每个诗人,有很多 著作,每个著作有很多读者

上面的map
Map<String, Map<String, List<String>>> maps = new HashMap<String, Map<String, List<String>>>();
是按照
诗人-著作-读者 来存储数据的
现在要把上面的map的数据转换成
读者-著作-诗人
即,读者 对应有很多著作,每个著作属于一个诗人

求方法,

谢谢
...全文
255 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小T 2014-05-09
  • 打赏
  • 举报
回复
对于OO语言来说, 这样写代码的practice是不好的。。 因为这么写出来的代码耦合度很高! 所以很难修改。 在设计的时候需要仔细考虑oo principle, 然后根据SOLID 五大原则进行适当的设计,这样不管要怎么变数据,都是很轻松的事情。 毕竟我们能做到完全用object来表示想要表达的关系 最正确的方法是根据SRP(单一责任原则)把这三个事物写成class,然后在class里边整理清楚他们的关系 举例说明,
引用
每个诗人,有很多 著作
我需要一个class用来作为著作

public class Work {
   //name of the work, e.g.  早发白帝城
    private String workName;
    //gets and sets
}
那么我可以写一个class 叫做诗人, 来满足你的描述

public class Poet{
   //  Name of poet
    private String poetName;
   //the work created by the poet
    List<Work> authoredWork; 
}
但同时, 诗人也可以作为一个作品的属性, 那么把诗人定义在work class里也是可以的, 这样的话就比较符合你下边想要的数据结构。

public class Work {
   //name of the work, e.g.  早发白帝城
    private String workName;
    private Poet author;
    //gets and sets
}
而读者和诗的关系并不是那么密切, 所以最好的办法应该是用observer pattern 让读者可以自由subscribe要读什么诗。。 这样可以保证代码有最低的耦合度。
孤好梦中杀人 2014-05-08
  • 打赏
  • 举报
回复
引用 3 楼 suciver 的回复:
诗人-著作-读者 来存储数据的 现在要把上面的map的数据转换成 读者-著作-诗人 即,读者 对应有很多著作,每个著作属于一个诗人 那不就是将 Map<String, Map<String, List<String>>> maps = new HashMap<String, Map<String, List<String>>>(); 转成 Map<String,List<Map<String,String>>> maps = new HashMap<String,List<Map<String,String>>>(); 第一个key的代表读者,value是一个List读者的著作,这个著作又是个Map著作存放的是诗人为key,著作的名称为value
诗人-著作-读者 来存储数据的 现在要把上面的map的数据转换成 读者-著作-诗人 即,读者 对应有很多著作,每个著作属于一个诗人 这里假设一个著作可以属于多个诗人 怎么做,用java如何实现
suciver 2014-05-08
  • 打赏
  • 举报
回复
诗人-著作-读者 来存储数据的 现在要把上面的map的数据转换成 读者-著作-诗人 即,读者 对应有很多著作,每个著作属于一个诗人 那不就是将 Map<String, Map<String, List<String>>> maps = new HashMap<String, Map<String, List<String>>>(); 转成 Map<String,List<Map<String,String>>> maps = new HashMap<String,List<Map<String,String>>>(); 第一个key的代表读者,value是一个List读者的著作,这个著作又是个Map著作存放的是诗人为key,著作的名称为value
孤好梦中杀人 2014-05-08
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
先把数据的关系理清楚,然后存入关系型数据库中,然后你想怎么折腾都很简单了。
要是能用数据库解决就好了,现在的问题是,不能用数据库。 只能用java解决。 求方法。
rumlee 2014-05-08
  • 打赏
  • 举报
回复
先把数据的关系理清楚,然后存入关系型数据库中,然后你想怎么折腾都很简单了。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧