【问题标题】:Insertion Sort Function插入排序功能
【发布时间】:2015-02-24 00:21:03
【问题描述】:

这个插入排序函数应该接受一个 Drink 对象数组,并根据它们的一个属性(成本)对它们进行排序。此属性由 getCost() 获取。我不断收到 NullPointer 错误。代码如下:

    public void sortDrinks(Drink[] drinks){
    for(int i = 1; i <= drinks.length; i++){
        Drink key = drinks[i];
        int count = i-1;
        while((count >= -1)&&(drinks[count].getCost() > key.getCost())){
            drinks[count+1] = drinks[count];
            count--;
        }

        drinks[count+1] = key;
    }

}

【问题讨论】:

    标签: java sorting insertion-sort


    【解决方案1】:

    当 count 等于 -1 时,您正在尝试访问饮料 [-1] 的 getcost 方法。我相信如果您将“while count >= -1”更改为“while count > -1”,这将得到解决。

    这显然需要进行少量重组,以便将饮料插入正确的位置。

    【讨论】:

    • 我可能对重组有误。在这种情况下,当循环以 count == 0 开始时,它以 count == -1 退出。如果您的测试条件为 count >= -1,那么它再次测试为真,您最终得到 count == -2。如果您只是将 >= 更改为 >,那么它应该可以工作。
    • 啊。长度为 5 的数组从 [0] 到 [4]。因为您是从 i == 1 步进到 i == Drinks.length,所以您是在数组末尾步进。它在 while 循环行上显示为错误,因为这是您实际访问数组元素的第一个位置。始终提高到
    • 最终更新:最后一刻的发现让我意识到自己是个白痴。我创建了大小为 10 的数组,只实例化了该大小的五个对象。所以我试图进入一个未实例化对象的数组。这就是为什么我创建了一个计数器变量,每次创建一个新对象时它都会递增......显然我忘记了所说的计数器。所以。那解决了它。谢谢你:)
    • 你能检查 count 和 i 失败时的值吗?如果你边走边记录它们,那应该会给你一个线索。如果它根本没有启动,请检查列表中的对象是否已实际创建。
    • 我深表同情。搞清楚它做得很好!另外,不客气。如果您能将问题标记为“已解决”,我将不胜感激。
    【解决方案2】:

    为什么不在你的 Drink 类中实现类似的接口?

    public class Drink implements Comparable<Drink> {
    
        // attributes and constructor
    
        public int getCost() {
            return cost;
        }
    
        public int compareTo(Drink other) {
            return getCost().compareTo(other.getCost());
        }
    }
    

    然后您可以对传递的 Drink 对象数组进行排序:

    Collections.sort(drinks); // returns the sorted drinks
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多