Java实现依赖关系排序_如何对服务依赖进行排序?(多服务, 多依赖)

from functools import reduce as _reduce

class CircularDependencyError(ValueError):

def __init__(self, data):

s = "Circular dependencies exist among these items: {{{}}}".format(

", ".join(

"{!r}:{!r}".format(key, value) for key, value in sorted(data.items())

)

)

super(CircularDependencyError, self).__init__(s)

self.data = data

def toposort(data):

if len(data) == 0:

return

# Copy the input so as to leave it unmodified.

data = data.copy()

# Ignore self dependencies.

for k, v in data.items():

v.discard(k)

# Find all items that don't depend on anything.

extra_items_in_deps = _reduce(set.union, data.values()) - set(data.keys())

# Add empty dependences where needed.

data.update({item: set() for item in extra_items_in_deps})

while True:

ordered = set(item for item, dep in data.items() if len(dep) == 0)

if not ordered:

break

yield ordered

data = {

item: (dep - ordered) for item, dep in data.items() if item not in ordered

}

if len(data) != 0:

raise CircularDependencyError(data)

if __name__ == "__main__":

group1 = {"A": {"B", "E"}, "C": {"B"}, "B": {"E", "F"}, "G": {"B"}}

print(list(toposort(group1)))

group2 = {"X": {"Y"}, "Z": {"Y"}}

print(list(toposort(group2)))

# 如果一开始给的数据, 是group1和2合并在一起的

# 如何把数据分成两个组, 并且分别做拓扑排序

init_data = {**group1, **group2}

print(list(toposort(init_data)))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值