1

Ojbects の 2 つの配列をトラバースすると思われるメソッドがあります。最初はサイズ 50 のメニューで、Recipes を含みます。これには、食材と呼ばれる最大 10 の要素を保持し、それぞれ最大 3 つの要素を保持しますが、私はそれらを探しているだけです。名前!Recipes 内のこれらの Ingredient 要素の一致する名前を取得し、それらを String 配列に追加してから返したいと思います。これが私のコードです...

public class Recipe implements Cloneable
{

    String Name;

    final int INGREDIENT_ARRAY_MAX = 10;

    Ingredient Ingredients[] = new Ingredient[INGREDIENT_ARRAY_MAX];

    public class RecipeBook
    {

        final static int MENU_ARRAY_MAX = 50;

        static Recipe Menu[] = new Recipe[MENU_ARRAY_MAX];

        public static String[] getRecipesByIngredient(String ingredientName)
        {

            String[] targetRecipes = new String[MENU_ARRAY_MAX];

            int counter = 0;

            for (int j = 0; j < Menu.length; j++)
            {

                if (Menu[j] == null)
                {

                    break;

                }

                else
                {

                    for (int k = 0; k < Menu[j].Ingredients.length; k++)
                    {

                        System.out.println(Menu[j].Ingredients[k]);

                        if (Menu[j].Ingredients[k].getName().equals(ingredientName))
                        {

                            targetRecipes[counter] = Menu[j].getName();
                            counter++;

                        }
                    }
                }
            }

            return targetRecipes;

        }
    }
}

今、私はそれが機能しないこととその理由を知っていますが、解決策はわかりません。現時点では、各レシピに 3 つのレシピと 3 つの材料しかありません! 一番上のものは参考用です。これらは RecipeBook (Menu) と Recipes (Ingredients) のオブジェクト配列です。

このコードを実行すると、文字列に対してnullをテストしようとするため、NullPointerExceptionが発生しますが、レシピをチェックするにはどうすればよいですか。何も見つからない場合は、メニューの次のレシピに移動します。単に追加しますが、終了するまでチェックを続けます。nullではなくnullをチェックする「if」ステートメントを追加しようとしましたが、複雑になり、プログラムが残りの配列のチェックに戻ることはありません。最初の「if」が残っている可能性があることはわかっています。メニューでチェックしたスポットが null の場合、残りの部分は null でなければならないため、それ以上進む意味がないからです。しかし、どうすれば Ingredients 配列をチェックし、何かを見つけ、追加し、その食材を使ったレシピのメニューをふるいにかけますか? 内側のループ内に if を追加して null をチェックし、そうであれば外側のループに戻ることはできますか?

4

2 に答える 2

0

レシピ配列をどのように埋めるかはわかりませんが、コードに多くのnullチェックがないことがわかります。私はこのように行きます(コードはコンパイル/テストされていません):

public static String[] getRecipesByIngredient(String ingredientName) {
    String[] targetRecipes = null;
    // check input parameter ingredientName against null and do lookup only if it is not null
    if(ingredientName != null) {
        // init the result array and do look up
        targetRecipes = new String[MENU_ARRAY_MAX];
        for (int j = 0; j < Menu.length; j++) {
            // you might run into NPE if Menu[j] or if the array of ingredients in Menu[j] (Menu[j].Ingredients) is null
            if(Menu[j] != null && Menu[j].Ingredients != null) {
                for (int k = 0; k < Menu[j].Ingredients.length; k++) {
                    // Menu[j].Ingredients[k] may also be null
                    // Menu[j].Ingredients[k].getName() may also be null but no need to check it since
                    // you call equals of the string object ingredientName witch you already checked
                    // and equals(null) is always false in that case
                    if (Menu[j].Ingredients[k] != null && ingredientName.equals(Menu[j].Ingredients[k].getName()) {
                        // here you might want to check Menu[j].getName() against null otherwise you'll have
                        // a null inside your result array (this is some like a land mine) unless you want
                        // to check against null while iterating over you result array
                        if(Menu[j].getName() != null) {
                            targetRecipes[counter++] = Menu[j].getName();
                        }
                    }
                }
            } // save the else...
        }
    } // else targetRecipes is still null, with witch you may want to say "no result found"
    return targetRecipes;
} 
于 2013-02-12T20:21:37.003 に答える
0

条件が以下の場合に更新

1 番目の if 条件:

if (Menu[j] == null || Menu[j].Ingredients == null || Menu[j].Ingredients.length ==0)

2 番目の if 条件:

if (Menu[j].Ingredients[k] != null && materialsName.equal(Menu[j].Ingredients[k].getName())) 問題があればお知らせください。

于 2013-02-12T20:20:22.473 に答える