2013-08-27 145 views
0

我想寫一個接受房屋數組和價格priceLimit的方法。我想要該方法爲價格低於或等於priceLimit的房屋返回一組房屋。我想通過數據來確定返回數組的大小。問題是我無法弄清楚如何將房屋陣列中的House對象添加到lowPriceHouses數組中。我得到的錯誤是:java方法接受對象數組,然後double返回一個對象數組

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

錯誤是因爲lowPriceHousesnull,您尚未初始化它。你的循環也會有問題,Java數組索引爲0

所以,與其

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

您應該使用...

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

你的問題是要知道有多少元素將匹配你的情況。

現在,您可以使用System.arraycopy或者只是使用某種List來代替。您可以使用List#toArray將列表轉換回數組。

更多細節

與例如更新見Collections

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()]); 
} 
+0

當你指定ArrayList爲什麼你要定義長度?我的意思是'lowPriceHouses'不可能小於原始數組?那不會有空的元素嗎? –

+0

@DimitarDimitrov'ArrayList'是一個動態數組,也就是說,它可以包含更多或更少的項目,當你需要它就會成長。但是爲此付出代價。隨着名單增長超出目前的「限制」,它需要調整大小。這是通過在緩衝區中添加一些「空白」空間來完成的。但是這需要時間和記憶。相反,我們提供了我們可能具有的值的「猜測」。這使得它更快。由於我們知道我們永遠不會比'houses.length'項目多,因此使用此值作爲初始值是安全的。 – MadProgrammer

+0

我明白了,所以這不會分配數組,它只會設置一個限制? –

1

你需要你寫它之前創建陣列。

House[] lowPriceHouses = null; 

應該像

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

你真正想要一個較小的數組,因爲,你可能並不需要所有的房屋.. 它會更容易使這個ArrayList,然後之前進行轉換toArray返回。


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

你想要做的只是<

這是因爲當你有大小10的陣列裏的元素是從0索引 - 9。因此訪問元素arr[10]會導致問題。

+0

我仍然得到一個錯誤:在線程異常「主」顯示java.lang.NullPointerException在prob3.HouseTester.getLowPriced(HouseTester.java:76)在prob3.HouseTester.main(HouseTester.java:52) –

+0

@KelliDavis有2個問題,我與這兩個更新它,一起來看看。 –

+0

就像旁白一樣,這類任務似乎更適合Set而不是List。這可能是因爲房屋的名單有某種內在的秩序,使得指數自然與房子相關的......但是,我想這是不是我期望在這裏。你真的只是處理一系列房屋。如果這是我,我會通過簡單地返回一個房屋集合(集合,列表,不管)來簡化我的生活。 – scottb

0

您lowPriceHouses是空所以你得到的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()]); 
} 
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()]); 
} 
+0

男孩......看起來很難看。 – scottb