我尝试使用Kahn算法编写程序,与BFS有关。由于队列和列表具有准确的密钥,是否有任何方法可以删除队列并使列表像队列一样执行并仍然返回值?我被告知要保留List的首选项,而不是像队列那样删除键。我不知道怎么做。任何建议表示赞赏。这是我计划的一部分。
private static List<Job> topologicalSortBFS(final List<Job> jobs) //Kahn's
{
final List<Job> sorted = new ArrayList<>(jobs.size());
final Map<Job, Integer> inCount = new HashMap<>(jobs.size());
final Queue<Job> queue = new ArrayDeque<>();
for (final Job j : jobs)
{
/* Associate every node with the amount of nodes it requires. */
final int in = j.inbound.size();
inCount.put(j, in);
/* If the node requires nothing, then add to queue and sorted list. */
if (in == 0)
{
sorted.add(j);
queue.add(j);
}
}
while (!queue.isEmpty())
{
final Job current = queue.poll(); // poll = pop
for (final Job neighbor : current.outbound)
{
/* Remove an outgoing connection without modifying the node. */
final int updatedIncount = inCount.get(neighbor) - 1;
inCount.put(neighbor, updatedIncount);
/* If node is now considered a leaf, its requirements were met. */
if (updatedIncount == 0)
{
sorted.add(neighbor);
queue.add(neighbor);
}
}
}
return sorted;
}
答案 0 :(得分:1)
在您给定的代码中,只有poll( )
方法不适用于List
对象。但是,poll( )
以FIFO
方式工作,返回并从队列中删除最顶层的对象。或者,对于List
,您可以使用索引值为0的get(index)
方法获取第一个元素,并将其删除。但是您应该考虑对LinkedList
操作使用remove( )
,ArrayList
中的所有元素都将针对每次删除进行转移,这是一项代价高昂的操作。此外,LinkedList
在实现poll( )
接口时具有Queue
方法。
注意:队列最适合给定的示例,我的答案只是根据您的问题使用List的解决方法。