这样的一种数据结构用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.
有没有更合理一些的数据结构?
...全文
524 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 就这样咯

67,550

社区成员

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

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