0

家の配列と価格、priceLimit を受け入れるメソッドを作成しようとしています。価格が priceLimit 以下の家屋の配列を返すメソッドが必要です。データをパスして、戻り配列の大きさを決定したいと考えています。問題は、houses 配列から lowPriceHouses 配列に House オブジェクトを追加する方法がわからないことです。私が得ているエラーは次のとおりです。

    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

エラーは、初期化していないためlowPriceHousesです。nullループにも問題があります。Java 配列には0インデックスが付けられています。

だから、代わりに

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

あなたが使用している必要があります...

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

問題は、ケースに一致する要素の数を知ることです。

さて、System.arraycopyListをいじったり、代わりに何らかのものを使用したりできます。

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]; 

実際には、すべての家が必要なわけではないため、より小さな配列が必要です。これを aにしてから、返す前にArrayList変換する方が簡単です。toArray


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

やりたいだけ<

これは、サイズが 10 の配列がある場合、要素に 0 ~ 9 のインデックスが付けられるためです。したがって、要素arr[10]にアクセスすると問題が発生します。

于 2013-08-27T02:35:38.140 に答える
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 に答える