微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用通配符支持发布、订阅和取消订阅操作的数据结构

如何解决使用通配符支持发布、订阅和取消订阅操作的数据结构

我正在尝试实现一个支持以下操作的数据结构:

  1. publish:客户端向主题名称发布消息。
  2. 订阅:客户端订阅主题名称
  3. 取消订阅:客户端取消订阅主题名称

这里具有挑战性的部分是主题名称可以是分层的,因此 主题名称如下所示

/a/b/f
/a/b/d
/a/c/e
/a/c/f
/a/c/f/t

so I am representing them as a tree which looks as
          '$' --> root  
         /
        a
      /   \ 
     b     c
    / \   / \
   f   d e   f
            /
           t  

我的python类如下

class TopicTreeNode:
   def __init__(self,name):
      self.name = name
      self.childrens = set()
      self.subscribed_clients = set()

我通过在树中表示主题来实现它,树中存储了订阅主题的客户集。

  1. 我通过获取所有客户端来实现发布操作 通过在我的树中从上到下进行搜索来匹配给定的主题名称 底部
  2. 类似的订阅包括向树中添加 客户端(通过创建主题,如果它不存在于树中)
  3. 类似地,取消订阅涉及从主题节点中删除客户端。

现在具有挑战性的部分是我必须在发布和订阅主题名称中实现对通配符的支持。 这样我就可以了

/a/* --> all topics whose parent topic is a [/a/b/f,/a/b/d,/a/c/e,/a/c/f,/a/c/f/t]
/a+/f --> all topics whose parent topic is a followed by any topic followed by topic f [/a/b/f,/a/c/f]

有人可以建议如何添加通配支持吗?

解决方法

您可以在re包的帮助下遍历树并检查主题名称是否与通配符匹配。

示例代码:

import re

nodes = [   '/a/b/f','/a/b/d','/a/c/e','/a/c/f','/a/c/f/t']

for node in nodes:

    if re.fullmatch('/a/.*',node):
        print('{} matched first case'.format(node))

    if re.fullmatch('/a/./f',node):
        print('{} matched second case'.format(node))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。