我是以正确的方式写这种方法吗?

时间:2011-01-31 20:59:23

标签: java methods arraylist

我有一个名为ArrayList的{​​{1}},它存储已经拣配并放在传送带上的订单。我有另一个名为conveyorBelt的{​​{1}},其中包含客户可以收集的订单列表。

我正在尝试使用我创建的方法,当输入ArrayList时,如果订单已准备好由客户收集,则返回true(从而从{{删除收集的订单) 1}})。如果订单尚未被选中,则返回false。

我想知道这是编写方法的正确方法......

readyCollected

4 个答案:

答案 0 :(得分:1)

我有点困惑,因为你根本没有使用ordNum

如果您想确认代码的操作并且通常会提高您所编写代码的可靠性,那么您应该查看unit testing以及可用的Java框架。

答案 1 :(得分:1)

您可以使用ArrayList来解决此问题,但我认为这从根本上是错误的思考问题的方法。 ArrayList适用于存储完整的数据序列而没有间隙,您可能只在最后添加或删除元素。删除其他位置的元素是低效的,如果你只有一个高索引值,那么你将浪费大量空间填充所有较低位置的空值。

相反,我建议使用Map将订单号与特定订单相关联。这更自然地编码您想要的 - 每个订单号都是与订单相关联的密钥。 Map s,特别是HashMap s,具有非常快速的查找(预期的恒定时间)并且使用(大致)相同的空间量,无论有多少个键。此外,从HashMap插入或删除元素的时间是预期的恒定时间,这非常快。

至于你的特定代码,我同意Brian Agnew的说法,你可能想为它编写一些单元测试,并找出你没有使用ordNUm参数的原因。也就是说,我建议在执行此操作之前将系统重新设置为使用HashMap而不是ArrayList;节省时间和代码复杂性将真正得到回报。

答案 2 :(得分:0)

根据您的描述,为什么这不够:

  public boolean collectedOrder(int ordNum)   {         
      return (readyCollected.remove(ordNum) != null);
  }

为什么甚至需要检查conveyorBelt ArrayList?

答案 3 :(得分:0)

正如已经指出的,您很可能需要使用ordNum

除此之外,任何人都可以使用您发布的代码给出的最佳答案是“也许”。你的逻辑看起来肯定是正确的,并与你所描述的内容联系在一起,但它是否正在做它应该做的事情完全取决于你在其他地方的实现。

作为一般指针(在这种情况下可能适用或不适用),您应该确保您的代码处理边缘情况和不正确的值。因此,如果readyCollected.remove(b);返回false,您可能希望标记出错,因为这表示b不在要删除的列表中。

正如已经指出的那样,看一下使用JUnit进行单元测试的事情。它易于使用,编写彻底的单元测试是一个非常好的习惯。