0

我正在尝试编写一个接受房屋数组和价格 priceLimit 的方法。我希望该方法为价格小于或等于 priceLimit 的房屋返回一组房屋。我想传递数据以确定返回数组的大小。问题是我不知道如何将 House 对象从 house 数组添加到 lowPriceHouses 数组。我得到的错误是:

    Exception in thread "main" java.lang.NullPointerException at 
prob3.HouseTester.getLowPriced(HouseTester.java:76) at 
prob3.HouseTester.main(HouseTester.java:52)

编码

private static House[] getLowPriced(House[] houses, double priceLimit) 
{

    House[] lowPriceHouses = null;
    int index = 0;

    for (int i = 0; i <= houses.length; i++)
    {
        double prices = houses[i].getPrice();
        if (prices <= priceLimit)
            lowPriceHouses[index++] = houses[i];
    }

    return lowPriceHouses;  
}
4

4 回答 4

4

错误是因为lowPriceHousesnull,你还没有初始化它。您的循环也会有问题,Java 数组是0索引的。

所以,而不是

for (int i = 0; i <= houses.length; i++)

你应该用...

for (int i = 0; i < houses.length; i++)

您遇到的问题是知道有多少元素将与您匹配。

现在,你可以乱用System.arraycopy或者只是使用某种List代替。

然后,您可以List#toArray在完成后将列表转换回数组。

有关更多详细信息,请参阅集合

更新了示例

private static House[] getLowPriced(House[] houses, double priceLimit) 
{

    List<House> lowPriceHouses = new ArrayList<House>(houses.length);

    for (int i = 0; i <= houses.length; i++)
    {
        double prices = houses[i].getPrice();
        if (prices <= priceLimit)
            lowPriceHouses.add(houses[i]);
    }

    return lowPriceHouses.toArray(new House[lowPriceHouses.size()]);  
}
于 2013-08-27T02:37:46.757 回答
1

您需要在写入之前创建数组。

House[] lowPriceHouses = null;

应该是这样的

House[] lowPriceHouses = new House[houses.length]; 

您实际上想要一个较小的数组,因为您可能不需要所有房屋。将其设置为 aArrayListtoArray在返回之前对其进行转换会更容易。


for (int i = 0; i <= houses.length; i++)

你只想做<

这是因为当您有一个大小为 10 的数组时,元素的索引从 0 到 9。因此访问该元素arr[10]会导致问题。

于 2013-08-27T02:35:38.140 回答
0

你 lowPriceHouses 是 Null,所以你得到 NullPointerException。请用下面的代码替换

private static House[] getLowPriced(House[] houses, double priceLimit)  {
    List<House> lowPriceHouses  = new ArrayList<House>()
    int index = 0;

    for (int i = 0; i <= houses.length; i++)
    {
         double prices = houses[i].getPrice();
         if (prices <= priceLimit)
           lowPriceHouses.add(houses[i]);
    }

    return lowPriceHouses.toArray(new House[lowPriceHouses.size()]); 
}
于 2013-08-27T02:43:21.123 回答
0

或者,如果您使用的是 Java 8,您可以这样做:

public static House[] getLowPriced(final House[] houses, final double limit){
    final List<House> list = Arrays.asList(houses).stream().filter(h -> h.getPrice() <= limit).sorted(Comparator.comparing(House::getPrice)).collect(Collectors.toList());
    return list.toArray(new House[list.size()]);
}
于 2013-08-27T03:41:16.783 回答