【问题标题】:Using an Interface in another interface在另一个接口中使用一个接口
【发布时间】:2011-06-30 18:23:20
【问题描述】:

我不确定如何继续将元素添加到优先级队列。我不希望代码成为我的勺子,有人可以向我解释如何使用传递给另一个接口的接口作为参数和一个实现其方法之一的类。请给我指点,我会查一下并学习如何实现这段代码。

QueueItem 类

 public interface QueueItem 

     {

     /** 
    * Returns the priority of this item. The priority is guaranteed to be 
    * between 0 - 100, where 0 is lowest and 100 is highest priority.
    */

    public int priority();

    }

PriorityQueue 类

 public interface PriorityQueue 

     {

    /**
    * Inserts a queue item into the priority queue.
    */
    public void insert(QueueItem q);

    /**
    * Returns the item with the highest priority.
    */
    public QueueItem next();

 }

QuickInsertQueue 类

public class QuickInsertQueue implements  PriorityQueue  {

    @Override
    public void insert(QueueItem q) {
        // TODO Auto-generated method stub

    }

    @Override
    public QueueItem next() {
        // TODO Auto-generated method stub
        return null;
    }

}

我必须编写一个实现PriorityQueueQuickInsertQueue 类 接口有insert() 方法O(1)。

【问题讨论】:

  • 不,这是在线测试你的技能,我想这样做来提高我的技能,花了一天时间想不通。
  • 不清楚您在这里需要什么帮助 - 是如何实现 O(1) 算法吗?一般是怎么写一个实现PriorityQueue接口的类? “如何使用传递给另一个接口作为参数的接口和实现其方法之一的类”这句话很难解析。
  • Matt b,我写不出来“一般是怎么写一个实现PriorityQueue接口的类?”
  • 在此处获取有关接口的一些说明stackoverflow.com/q/8531292/1055241

标签: java data-structures priority-queue


【解决方案1】:

您已经在正确的轨道上。您的接口已定义,并且您的类定义附加了正确的实现。既然您说您不希望将代码勺子喂给您,我对此表示赞赏-您要实现的下一步实际上是将 HashMap 实例变量添加到您的类中,因为那是您的底层存储。在您的插入方法实现中,您将把变量添加到地图中。

最终你需要阅读Generics

【讨论】:

  • 我看不出泛型与这个特定问题有什么关系。
  • 当他试图定义那个 Hashmap 变量时。
  • 我不明白 HashMaps 是如何相对的。 :) 但我想这就是作者将其从问题中删除的原因。
  • 好吧,它们不再“相关”了!哈哈,但实际上他用最初发布的核心回答了他自己的问题。
【解决方案2】:

Ted 和 Perception 告诉过你你需要什么。我的另一个建议是您需要找到要使用的正确数据结构,以便插入是 O(1)。我建议你看看堆。专门查看 min-heaps 可以让您在恒定时间内插入。 Look here。我希望这有帮助。

【讨论】:

  • 如何实现 public void insert(QueueItem q) { // TODO 自动生成的方法存根 }
【解决方案3】:

您使用接口来保证您收到的任何对象都将按照该接口运行。这就是为什么你的QuickInsertQueue 需要实现PriorityQueue 的方法。但是,它可以使用的关于插入对象的唯一信息是它们的行为符合QueueItem 接口——也就是说,它们有一个返回intpriority() 方法。您的实现可以依赖于它将管理的对象,但仅此而已。

【讨论】:

    【解决方案4】:

    你在正确的轨道上。 因此,无需深入了解您正确的代码级细节,您应该自己弄清楚,它(应该)在理想世界中是如何工作的 -

    1. 系统中不同类型对象之间的所有交互都是通过使用接口来定义的。即,如果您需要了解“事物如何在我的应用程序中交互”,您应该只需要查看所有接口即可。 (其他一切都是实现细节。)换句话说,所有实际工作都由类(实现接口)完成,但交互 em> 由接口定义

    2. 一个实现类,例如QuickInsertQueue,不需要了解其他实现。 (例如 QueueItem 的实现)即 QueueItem 不需要知道哪个类正在实现 PriorityQueue,PriorityQueue 也不需要知道实现 QueueItem 的类。 (为此,请确保in 接口具有允许其他人与之交互所需的所有方法。另请注意,类可以实现多个接口)

    实际上,

    • 除非您使用像factory method pattern 和/或像SpringGuice 这样的IoC 容器,否则您至少会有一个实现实例(即类的对象)实例化其他实现(其他类的对象)在您的系统中。

    (在这种情况下,插入应该是 O(1) 的数据结构是一个实现细节问题/讨论)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多