bugfix> c# > 投稿

配列xから2つ以上の同じ要素を見つけて、その複製を新しい配列Yに追加しようとしました

したがって、xに2,5,7,2,8のような配列番号がある場合、y配列に数値2を追加します

int[] x = new int[20];
        Random rnd = new Random();
        int[] y = new int[20];
        int counter = 0;

        for (int i = 0; i < x.Length; i++)
        {
            x[i] = rnd.Next(1, 15);
            for (int j=i+1;  j< x.Length; j++)
            {
                if (x[i] == x[j]) 
                {
                    y[counter] = x[i];
                    Console.WriteLine("Repeated numbers are " + y[counter]);
                    counter++;
                }
                else
                {
                    Console.WriteLine("There is no repeated numbers, numbers that are in x are  " + x[i]);
                }
                break;
            }
        }

しかし、問題があり、ifループになると、ifループの実行を続行したくありません(条件がtrueであっても)

誰かが私にいくつかの提案をすることができたら、それは助けになるでしょう、ありがとう

回答 5 件
  • for の使用にはさまざまな論理エラーがあります 。ライブラリは暗記することで学習できますが、論理エラーは自分の内部にあるものであるため、ロジックにもっと取り組む必要があります。

    int[] x = new int[20];
    Random rnd = new Random(5);
    // You don't know the length of y! 
    // So you can't use arrays
    List<int> y = new List<int>();
    // First initialize
    for (int i = 0; i < x.Length; i++)
    {
        x[i] = rnd.Next(1, 15);
    }
    // Then print the generated numbers, otherwise you won't know what numbers are there
    Console.WriteLine("Numbers that are in x are: ");
    for (int i = 0; i < x.Length; i++)
    {
        Console.WriteLine(x[i]);
    }
    // A blank line
    Console.WriteLine();
    // Then scan
    for (int i = 0; i < x.Length; i++)
    {
        for (int j = i + 1; j < x.Length; j++)
        {
            if (x[i] == x[j])
            {
                y.Add(x[i]);
                Console.WriteLine("Repeated numbers is " + x[i]);
            }
        }
    }
    // Success/failure in finding repeated numbers can be decided only at the end of the scan
    if (y.Count == 0)
    {
        Console.WriteLine("There is no repeated numbers");
    }
    
    

    コードにいくつかのコメントを追加しました(および変更)

    デバッグのために、固定の Random を使用することをお勧めします  シーケンス。 new Random(5)  (または他の番号)は、プログラムを起動するたびに同じシーケンスを返します。

    { 4, 4, 4 } のように数字の繰り返しが複数ある場合は注意してください  y配列は { 4, 4 } になります

  • 最初は: なぜ 'break;'を使用するのですか? ?

    2番目: 最初のfor-ループuで乱数をx [i]に割り当てます しかし、ネストされた2番目のループで uはすでにx [j]に同じ値をチェックするように頼みます(しかし、それはまだ存在しません)

    値が等しいかどうかを確認する方法はたくさんありますが、 しかし、私はあなたのアプローチが好きです: だから私が提案するもの:

    for-ループを作成し、すべての乱数をint [] xに割り当てます

    その後、あなたがどのように評価できるかをもう一度考えてください x [0] = x [1]またはx [2]またはx [3] ...

  • Linqを使用して、配列内の重複を見つけてください。

    int[] x = new int[] { 2, 5, 7, 2, 8 };
    int[] y;
    var result = x.GroupBy(item => item)
                  .Select(grp => new { key = grp.Key, Count = grp.Count() });
    y = result.Where(res => res.Count > 1).Select(res => res.key).ToArray();
    
    

  • int[] array = new int[5] {1,2,3,4,4};
    List<int> duplitcateList = array.Where(x => array.Where(y => y == x).Count() > 1).Distinct().ToList();
    
    

    または、上記のコードの最後の行を以下に置き換えることができます。

    List<int> duplitcateList = array.
        GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
    
    

    上記のコードはLinqを使用しています。

    最初の配列(問題の x )は array です 。 Linqは、リストに含まれるすべての要素を最初に複数回チェックし、それらを個別に選択して duplicateList に保存します

    配列が必要な場合は、これを行うことでこのリストを配列に変換できます。

    int[] yArray = duplitcateList.ToArray();
    
    

  • 以下のように、コードでlinqを使用します

    //first populate array x 
    var duplicates= xArray.GroupBy(x => x)
                  .Where(g => g.Count() > 1)
                  .Select(y => y.Key)
                  .ToArray();
    
    

    上記のlinqクエリはgroupbyを使用して、重複する要素、つまり配列内で複数回出現する要素を見つけ、それらの要素を選択して結果を返します

あなたの答え