0

Java 对象优先

使用 BlueJ 的实用介绍

工作扔了这本书,我不明白这个练习要求我做什么。

练习是...

练习 4.51 重写 getLot 使其不依赖于存储在集合中索引 (number-1) 处的特定编号的批次。例如,如果批号 2 已被删除,那么批号 3 将从索引 2 移动到索引 1,并且所有更高的批号也将移动一个索引位置。您可以假设批次总是根据其批号以递增的顺序存储。

    /**
         * Return the lot with the given number. Return null if a lot with this
         * number does not exist.
         *
         * @param lotNumber The number of the lot to return.
         */
        public Lot getLot(int lotNumber) {
            if ((lotNumber >= 1) && (lotNumber < nextLotNumber)) {
                // The number seems to be reasonable.
                Lot selectedLot = lots.get(lotNumber - 1);
                // Include a confidence check to be sure we have the
                // right lot.
                if (selectedLot.getNumber() != lotNumber) {
                    System.out.println("Internal error: Lot number "
                            + selectedLot.getNumber()
                            + " was returned instead of "
                            + lotNumber);
                    // Don't return an invalid lot.
                    selectedLot = null;
                }
                return selectedLot;
            } else {
                System.out.println("Lot number: " + lotNumber
                        + " does not exist.");
                return null;
            }
        }

用伪代码提示正确的方向就可以了。我真的很困惑练习要求我做什么。

我会坦率地说,这是一个班级,老师真的只是把书递给我们,几乎没有指导。所以我不是在找人写作业,我只是想要一些帮助。请不要喷我,因为我在问。这是一个问编码问题的地方?不?提前致谢。

4

2 回答 2

1

给定方法的算法依赖于lotNumber存储在 index中的批次lotNumber-1。它只是通过索引查找它并验证它是否找到了正确的索引。

练习就是放弃这个假设。批号和索引不再如此密切相关。所以你不能只计算指数,你必须搜索批次。

最简单的方法是查看您收藏中的每个批次,并在找到匹配的批次编号后将其退回。为此,您可以显式或隐式(“foreach”)使用迭代器。如果您的课程尚未涵盖迭代器,您还可以使用for循环来计算集合的所有现有索引。

但该练习指定批次仍按顺序存储。这允许您修改简单的方法,以便在您发现比您要查找的批号更高的批号时放弃。

最佳方法是对排序列表使用搜索算法,例如二分搜索

于 2013-06-04T09:48:14.343 回答
0

在您提供的代码中,有一个很大的假设:假设批号i存储在数组中的位置i-1。现在,如果我们不假设呢?好吧,我们不知道i阵列中的批次可能在哪里,所以唯一的解决方案是遍历阵列并寻找批次号i,希望我们能找到它。

于 2013-06-04T05:06:54.430 回答