我有一个名为ArrayList
的{{1}},它存储已经拣配并放在传送带上的订单。我有另一个名为conveyorBelt
的{{1}},其中包含客户可以收集的订单列表。
我正在尝试使用我创建的方法,当输入ArrayList
时,如果订单已准备好由客户收集,则返回true(从而从{{删除收集的订单) 1}})。如果订单尚未被选中,则返回false。
我想知道这是编写方法的正确方法......
readyCollected
答案 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进行单元测试的事情。它易于使用,编写彻底的单元测试是一个非常好的习惯。