我已经在这个问题上坚持了很长时间,并且无法在网络上的任何其他地方找到帮助,所以这可能对以后的其他人有用。
我有一个单词列表,列表中的每个单词都有自己的前后两个单词数组。
以下是一个例子:
"forest" - before:{"tree"}
"frog" - after:{"mushroom"}
"mushroom"
"leaf" - after:{"mushroom"}, before: {"frog"}
"tree" - before:{"mushroom"}
这些词应按以下顺序排列:森林,树木,蘑菇,叶子,青蛙。所以基本上,“之后”并不意味着一个词需要紧接着另一个词(也不是“之前”),它只是不能在所述词之前(或在“之前”之后)之后。
我试图通过使用数组列表并在自定义索引处添加元素来解决此问题,只要插入像“leaf”这样的元素(在两个其他元素之间的元素)就会中断。
这个例子已被简化,所以它不会让任何人感到困惑,我实际上是在编写一个mod加载器,它对注释说明它们应该在之后/之后执行哪些mod的方法进行排序。
编辑: 我设法通过在之前转换到数组之前包含的元素来解决问题。
之后,我所做的只是遍历所有元素,然后检查该元素是否已经执行(你会在一秒钟内看到原因),如果没有执行,先以同样的方式执行所有后面的元素然后执行实际元素。我也做了一些检查以防止循环等。
答案 0 :(得分:1)
我不会为你编写代码,但我会概述一些关于算法的提示。
首先要意识到的是after
信息中没有任何意义,因为B
之后A
与A
相同B
} after
之前。首先将所有before
信息替换为等效的before
信息。
接下来,您必须意识到,如果某个项目位于其中一个before
数组中,则无法首先执行此操作。所以你要做的就是浏览所有before
数组,找不到任何一个元素。如果这些数组中没有元素,则该元素可以先行。 (如果没有,问题就不可能了。)
一旦您确定哪个元素首先出现,请丢弃其Sub ClearTintAndShade()
On Error GoTo 1
Application.CutCopyMode = False
With ThisWorkbook.Sheets("Outputs 2").Range("B19:M24").Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Exit Sub
1:
MsgBox ("That sheet does not exist!")
End Sub
数组并使用递归完成列表。
答案 1 :(得分:0)
这是Topological Sort问题的一个实例。
方法的名称可以被视为图中的节点,并且“之前”和“之后”关系是所述图中的有向边。