1

これで私を助けてください。array2 の要素を介して array1 をスキャンし、array1 で見つかった場合は array2 の要素を無視したいと考えています。果物のリストだけが残ります。しかし、出力はボール、鉛筆を示しています。果物の要素のみを表示したい場所。ご協力いただきありがとうございます

import java.util.*;
public class CountFruits
{
    public static void main(String args[])throws Exception
    {
        String array1[] = {"apple", "mango", "orange", "banana", "ball", "pencil"};
        String array2[] = {"ball", "pencil"};
        List<String> fruits = new ArrayList<String>();
        for(int x = 0; x < array1.length; x++)
        {
            for(int y = 0; y < array2.length; y++)
            {
                if(array1[x].equals(array2[y]))
                {
                    System.out.println(array1[x] + "\t" + array2[y]);
                    if(!fruits.contains(array1[x]))
                    {
                        fruits.add(array1[x]);
                    }
                }
            }//end for
        }//end for
        System.out.println("fruits: " +fruits);
    }
}
4

5 に答える 5

3

まず、これは一種の宿題だと思いますので、コードを修正して演習を台無しにすることはしません。

アイデアは次のとおりです。ネストされたループが何かを検出したかどうかを示すブール変数を作成し、ループに入って「見つからない」に設定し、ループの後でチェックする必要があります。アイテムが見つかったことをループが示している場合は、それをスキップします。それ以外の場合は、追加します。fruits.addネストされたループが終了した後でのみ実行できるため、ネストされたループ内での呼び出しは時期尚早であることを忘れないでください。

boolean found = false;
for(int y = 0; !found && y < array2.length; y++) {
    found |= array1[x].equals(array2[y]);
}
if (!found) ...
于 2012-08-08T11:24:16.913 に答える
2

array1[x]リストにない場合は、リストに追加する必要がありarray2[x]ます。

if (array1[x].equals(array2[y])) {
    System.out.println(array1[x] + "\t" + array2[y]);
} else {
    fruits.add(array1[x]);
}

ただし、重複があります。追加する前に条件を追加できますif(!fruits.contains(...))

次のアルゴリズムを使用して、コードを簡略化できます。

  • array1のすべてのアイテムをリストに追加します
  • リストからarray2のアイテムを削除します
于 2012-08-08T11:23:10.327 に答える
1

ifステートメントif(array1 [x] .equals(array2 [y]))はボールと鉛筆にのみ当てはまるため、フルーツ配列はボールと鉛筆のみを追加します。フルーツ配列を設定してarray1のすべてを保持し、ifステートメントがtrueの場合は、その要素をフルーツ配列から削除します。

または、ブールisFruit = true(外側のforループ)を設定できます。次に、ifステートメントif(array1 [x] .equals(array2 [y]))が合格した場合、isFruitをfalseに設定します。内部ループの反復後、isFruitがtrueの場合、それをフルーツ配列に追加します。

for(int x = 0; x < array1.length; x++)
{
    boolean isFruit = true;
    for(int y = 0; y < array2.length; y++)
    {
        if(array1[x].equals(array2[y]))
        {
            System.out.println(array1[x] + "\t" + array2[y]);
            isFruit = false;
        }
        if(isFruit)
        {
            fruits.add(array1[x]);
        }
    }//end for loop
}//end for loop
于 2012-08-08T11:37:27.893 に答える
1

あなたの論理には2つの欠陥があります

1)ここでは、果物リストに追加してはならない要素を追加しています。そのため、array2 の一部ではない要素をチェックする必要があり、それらを追加する必要があります。したがって、 else部分にそのロジックを記述できます。

2) Setを使用する代わりに、要素がすでに果物リストに存在するかどうかを毎回チェックしています。重複エントリは許可されません

于 2012-08-08T12:18:10.740 に答える
1

最善のアプローチは、IDE を使用している場合は、コードをステップ実行して、ロジックが失敗する場所を確認することです。デバッガーを使用していない場合は、いくつかの System.out.println ステートメントをコードに挿入します。次に、ロジックが失敗した場所を特定できます。もう 1 つの解決策は、私が提供した最初の解決策を試すことです。つまり、果物の配列に配列 1 のすべてを保持させてから、配列 2 で見つかった要素を削除します。

于 2012-08-08T11:59:18.233 に答える