这样的一种数据结构用java怎样表示好一些?

逗泥丸的平方 2017-08-11 01:46:06
是一个权限树的功能. 解析之后大概是这样...

a1:b1(c1,c2,c3,c4)/b2(c1,c2,c3,c4)...
a2:b1(c1,c2,c3,c4)/b2(c1,c2,c3,c4)...

最后还要标识Cn节点是否生效.所以目前的结构是 三层的Map,最后里层一个Boolean.
有没有更合理一些的数据结构?
...全文
517 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2017-08-23
  • 打赏
  • 举报
回复
引用 14 楼 a276202031 的回复:
你赢了 老铁 你写段代码 几十个节点 按你的存储方式 然后 找出某一个节点以及子节点 然后罗列出来你看看区别 不想和你争
写一点伪代码吧. 大概我们理解不太一样. 前提是三层. 我的结构是这样的.

mapA = new Map<String , Map<String , Map<String,boolean>>>();
mapB = new Map<String , Map<String,boolean>>();
mapC = new Map<String,boolean>();
// 获取节点 先默认存在了,否则要put
mapA.get("an").get("bn").get("cn")
按照你说的方式 , 看起来应该是,是我哪里理解错了么

for(Node node : nodes){
  if(node.isRoot() && node.getId().equals("an")){
    node.getChildrens();
    // ... 遍历childrens 寻找bn,再去寻找cn 发现不存在时进行添加
  }
}
逗泥丸的平方 2017-08-23
  • 打赏
  • 举报
回复
引用 16 楼 a276202031 的回复:
[quote=引用 15 楼 qq_35209952 的回复:] [quote=引用 14 楼 a276202031 的回复:] 你赢了 老铁 你写段代码 几十个节点 按你的存储方式 然后 找出某一个节点以及子节点 然后罗列出来你看看区别 不想和你争
写一点伪代码吧. 大概我们理解不太一样. 前提是三层. 我的结构是这样的.

mapA = new Map<String , Map<String , Map<String,boolean>>>();
mapB = new Map<String , Map<String,boolean>>();
mapC = new Map<String,boolean>();
// 获取节点 先默认存在了,否则要put
mapA.get("an").get("bn").get("cn")
按照你说的方式 , 看起来应该是,是我哪里理解错了么

for(Node node : nodes){
  if(node.isRoot() && node.getId().equals("an")){
    node.getChildrens();
    // ... 遍历childrens 寻找bn,再去寻找cn 发现不存在时进行添加
  }
}
[/quote] 你用map 你把他转成json 格式 看看是怎样的json结构 能不能满足树的要求 [/quote] 为什么要转json..
浮云若水 2017-08-23
  • 打赏
  • 举报
回复
引用 15 楼 qq_35209952 的回复:
[quote=引用 14 楼 a276202031 的回复:] 你赢了 老铁 你写段代码 几十个节点 按你的存储方式 然后 找出某一个节点以及子节点 然后罗列出来你看看区别 不想和你争
写一点伪代码吧. 大概我们理解不太一样. 前提是三层. 我的结构是这样的.

mapA = new Map<String , Map<String , Map<String,boolean>>>();
mapB = new Map<String , Map<String,boolean>>();
mapC = new Map<String,boolean>();
// 获取节点 先默认存在了,否则要put
mapA.get("an").get("bn").get("cn")
按照你说的方式 , 看起来应该是,是我哪里理解错了么

for(Node node : nodes){
  if(node.isRoot() && node.getId().equals("an")){
    node.getChildrens();
    // ... 遍历childrens 寻找bn,再去寻找cn 发现不存在时进行添加
  }
}
[/quote]
引用 15 楼 qq_35209952 的回复:
[quote=引用 14 楼 a276202031 的回复:] 你赢了 老铁 你写段代码 几十个节点 按你的存储方式 然后 找出某一个节点以及子节点 然后罗列出来你看看区别 不想和你争
写一点伪代码吧. 大概我们理解不太一样. 前提是三层. 我的结构是这样的.

mapA = new Map<String , Map<String , Map<String,boolean>>>();
mapB = new Map<String , Map<String,boolean>>();
mapC = new Map<String,boolean>();
// 获取节点 先默认存在了,否则要put
mapA.get("an").get("bn").get("cn")
按照你说的方式 , 看起来应该是,是我哪里理解错了么

for(Node node : nodes){
  if(node.isRoot() && node.getId().equals("an")){
    node.getChildrens();
    // ... 遍历childrens 寻找bn,再去寻找cn 发现不存在时进行添加
  }
}
[/quote] 你用map 你把他转成json 格式 看看是怎样的json结构 能不能满足树的要求
浮云若水 2017-08-22
  • 打赏
  • 举报
回复
引用 13 楼 qq_35209952 的回复:
[quote=引用 12 楼 a276202031 的回复:] [quote=引用 11 楼 qq_35209952 的回复:] [quote=引用 10 楼 a276202031 的回复:] [quote=引用 9 楼 qq_35209952 的回复:] [quote=引用 7 楼 a276202031 的回复:] [quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上[/quote] 明面上你只需要知道key 就可以获取到对应的值 但底层操作呢?就好比list 你知道某一个值的索引 你直接用索引取 那更快,但是当你不知道key 和 索引的时候呢?看事不能看表面[/quote] 不知道你怀疑的是什么.. 在你看来map的hash算法对性能的损耗要超过遍历list吗.?[/quote] 老铁 没跟你纠结算法快慢 看清楚我的回答 ,集合本身会有一定影响 但对于你说的权限树 数据量能有多大?其实对你性能上没多大影响。当然是我个人经验而谈,好了祝你找到更好的办法 [/quote] 那你说的是什么意思.. 从操作的角度讲 map比list更容易啊... list还要去遍历,找到key一样的.. [/quote] 你赢了 老铁 你写段代码 几十个节点 按你的存储方式 然后 找出某一个节点以及子节点 然后罗列出来你看看区别 不想和你争
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 12 楼 a276202031 的回复:
[quote=引用 11 楼 qq_35209952 的回复:] [quote=引用 10 楼 a276202031 的回复:] [quote=引用 9 楼 qq_35209952 的回复:] [quote=引用 7 楼 a276202031 的回复:] [quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上[/quote] 明面上你只需要知道key 就可以获取到对应的值 但底层操作呢?就好比list 你知道某一个值的索引 你直接用索引取 那更快,但是当你不知道key 和 索引的时候呢?看事不能看表面[/quote] 不知道你怀疑的是什么.. 在你看来map的hash算法对性能的损耗要超过遍历list吗.?[/quote] 老铁 没跟你纠结算法快慢 看清楚我的回答 ,集合本身会有一定影响 但对于你说的权限树 数据量能有多大?其实对你性能上没多大影响。当然是我个人经验而谈,好了祝你找到更好的办法 [/quote] 那你说的是什么意思.. 从操作的角度讲 map比list更容易啊... list还要去遍历,找到key一样的..
浮云若水 2017-08-22
  • 打赏
  • 举报
回复
引用 11 楼 qq_35209952 的回复:
[quote=引用 10 楼 a276202031 的回复:] [quote=引用 9 楼 qq_35209952 的回复:] [quote=引用 7 楼 a276202031 的回复:] [quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上[/quote] 明面上你只需要知道key 就可以获取到对应的值 但底层操作呢?就好比list 你知道某一个值的索引 你直接用索引取 那更快,但是当你不知道key 和 索引的时候呢?看事不能看表面[/quote] 不知道你怀疑的是什么.. 在你看来map的hash算法对性能的损耗要超过遍历list吗.?[/quote] 老铁 没跟你纠结算法快慢 看清楚我的回答 ,集合本身会有一定影响 但对于你说的权限树 数据量能有多大?其实对你性能上没多大影响。当然是我个人经验而谈,好了祝你找到更好的办法
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 10 楼 a276202031 的回复:
[quote=引用 9 楼 qq_35209952 的回复:] [quote=引用 7 楼 a276202031 的回复:] [quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上[/quote] 明面上你只需要知道key 就可以获取到对应的值 但底层操作呢?就好比list 你知道某一个值的索引 你直接用索引取 那更快,但是当你不知道key 和 索引的时候呢?看事不能看表面[/quote] 不知道你怀疑的是什么.. 在你看来map的hash算法对性能的损耗要超过遍历list吗.?
浮云若水 2017-08-22
  • 打赏
  • 举报
回复
引用 9 楼 qq_35209952 的回复:
[quote=引用 7 楼 a276202031 的回复:] [quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上[/quote] 明面上你只需要知道key 就可以获取到对应的值 但底层操作呢?就好比list 你知道某一个值的索引 你直接用索引取 那更快,但是当你不知道key 和 索引的时候呢?看事不能看表面
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 7 楼 a276202031 的回复:
[quote=引用 5 楼 qq_35209952 的回复:] [quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的 [/quote] 因为修改的时候list需要遍历才能查找到目标啊, 而map只需要key就可以了. 当然map的遍历损耗在于最终的表达上
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 6 楼 u011115563 的回复:
感觉数据结构,对象是不错的,用list封装起来,看了楼上上的那些数据对像定义也不错啊。遍历是不可避免的。list遍历总的来说比map还是快点。
这样的问题在于, 我去修改一个anbncn的权限, 然后就要去 遍历三层来寻找这个cn,然后才能去修改他.. 如果说用来比较的话 也许是list好一些. 遍历map的话,基本上和链表的速度是等价的.. 而查找的时候map不需要遍历
浮云若水 2017-08-22
  • 打赏
  • 举报
回复
引用 5 楼 qq_35209952 的回复:
[quote=引用 2 楼 a276202031 的回复:] [quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.[/quote]怎么说使用map就能减少遍历损耗?不知道你说的损耗是在哪!递归耗时主要看你采用的算法相关,递归,当然递归也是有次数限制的,当然前提是你的数据凉非常之大,不然也无需关心这些。其实像上面这种,如果你转换成json也是key value形式的
小风9527 2017-08-22
  • 打赏
  • 举报
回复
感觉数据结构,对象是不错的,用list封装起来,看了楼上上的那些数据对像定义也不错啊。遍历是不可避免的。list遍历总的来说比map还是快点。
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 2 楼 a276202031 的回复:
[quote=引用 1 楼 a276202031 的回复:] topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点[/quote] 使用map的原因就是为了减少遍历的损耗.
逗泥丸的平方 2017-08-22
  • 打赏
  • 举报
回复
引用 3 楼 liangbingbing123 的回复:
写实体类啊,a1:b1(c1,c2,c3,c4)/b2(c1,c2,c3,c4)...

public class entityA
{
    public List<entityB> a1;
}

public class entityB
{
    public type c1;
    public type c2;
    public type c3;
    public type c4;
}
外面如果还有,A也放list里面去 依次就可以了
这种方式 任何一种修改都需要去遍历...
初见_冰 2017-08-12
  • 打赏
  • 举报
回复
写实体类啊,a1:b1(c1,c2,c3,c4)/b2(c1,c2,c3,c4)...

public class entityA
{
    public List<entityB> a1;
}

public class entityB
{
    public type c1;
    public type c2;
    public type c3;
    public type c4;
}
外面如果还有,A也放list里面去 依次就可以了
浮云若水 2017-08-11
  • 打赏
  • 举报
回复
引用 1 楼 a276202031 的回复:
topId nodeId nodeName pid list<node> childrens 就这样咯
顶级节点 节点id 节点名称 父节点 子节点
浮云若水 2017-08-11
  • 打赏
  • 举报
回复
topId nodeId nodeName pid list<node> childrens 就这样咯
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软全球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程安全数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法与数据结构太少太少。对于后期想要学习算法与数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解全靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法。
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软全球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程安全数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法与数据结构太少太少。对于后期想要学习算法与数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解全靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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