2

G'day

我有一个面向对象编程入门课程的 Java 作业。我已经完成了任务,程序按预期工作(我花了一段时间才实现这一点!),我得到了想要的输出。仅通过我的一种方法,我使用了 2 个带有 IF 语句的 FOR 循环,我想知道是否还有另一种更简单、更好或更有效的方法?但我不允许使用 ArrayList。我知道 ArrayList 更简单、更好、更高效,但是如果不能使用 ArrayList,是否可以让我的代码更好并且仍然达到相同的结果?

基本上我要求用户输入一个属性对象的 ID 号,然后将该 ID 与数组索引位置匹配,将该对象从一个数组 (propertiesForSale) 复制到另一个数组 (propertiesSold),将增量 1 添加到我的计数器(numPropertiesSold) 在删除和压缩(我的老师说重新洗牌)第一个 (propertiesForSale) 数组并将我的另一个计数器 (numPropertiesForSale) 递减 1 之前。

我的代码如下..

public void sellProperty(int inID)
    {
         for (int index = 0; index < numPropertiesForSale; index++) {

            if (propertiesForSale[index].getId() == inID) {

                propertiesSold[numPropertiesSold]= propertiesForSale[index];
                numPropertiesSold++;

                for (int i = index; i < numPropertiesForSale; i++) {

                propertiesForSale[i] = propertiesForSale[i + 1];
                }

                numPropertiesForSale--;
            }
        }
    }

如果有不使用 ArrayList 的更简单、更好或更有效的方法,我只是想知道是否存在以及如何完成。

感谢您的时间、耐心和投入(如果有)。

4

4 回答 4

3

如果你不被允许使用ArrayList,那在我看来几乎是你能做的最好的。

尽管不是使用循环将propertiesForSale数组向下移动一个,但您可能希望考虑使用System.arraycopy()而不是您自己的循环,因为arraycopy()它是一种本机方法。

于 2012-04-05T01:14:50.810 回答
1

您可以使用由节点组成的自定义链表。这样您在出售房产时就不需要移动数组的条目;您只需从列表中删除节点并更新指针。

于 2012-04-05T01:16:43.997 回答
1

您正在搜索inID. propertiesForSale当您找到匹配项时,您将该对象传输到下一个索引,propertiesSold然后通过将其上方的所有记录传输到更低的一个索引来压缩数组。最后一个元素就留在那里,但在下一次查找中不会访问它,因为您减少了计数。

另一种选择是根本不压缩数组,而是将其设置为空。您当然必须调整外部 for 循环中的最大界限并添加非空检查,但内部 for 循环已消失。

这个会比较好吗?也许。你所拥有的非常好。

于 2012-04-05T01:23:29.507 回答
1

propertiesForSale在出售房产之前,通过完全填充数组来测试您的代码。也就是说,如果numPropertiesForSale == propertiesForSale.length你试图移除一个元素会发生什么?

于 2012-04-05T06:13:20.370 回答