x数组中的重复元素添加到y数组中

时间:2018-05-25 06:40:41

标签: c# arrays

我试图从数组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循环(即使条件为真)

如果有人可以给我一些建议,那会有所帮助,谢谢

6 个答案:

答案 0 :(得分:4)

您使用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 }

答案 1 :(得分:2)

起初: 为什么你要使用&#39;休息;&#39; ?

第二: 在第一个for-loop中你给一个随机数指定x [i] 但随后在嵌套的第二个循环中 你已经要求x [j]检查相同的值(但还没有存在)

有很多方法可以检查数值是否相等, 但我喜欢你的方法: 所以我建议:

进行for循环并将所有随机数分配给int [] x

然后再想想你如何评价 x [0] = x [1]或x [2]或x [3] ......

答案 2 :(得分:0)

在代码中使用linq,如下所示

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

上面的linq查询使用groupby并在你的数组中找到重复的元素,然后你选择那些元素并返回结果

答案 3 :(得分:0)

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();

答案 4 :(得分:0)

尝试使用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();

答案 5 :(得分:0)

我认为如果没有复杂的扩展方法,这将是最容易理解的解决方案:

int[] x = new int[20];
// there can be at most 10 duplicates in array of length of 20 :)
// you could use List<int> to easily add elements
int[] y = new int[10];
int counter = 0;
Random rnd = new Random();
// fill the array
for (int i = 0; i < x.Length; i++)
    x[i] = rnd.Next(1, 15);
// iterate through distinct elements,
// otherwise, we would add multiple times duplicates
foreach (int i in x.Distinct())
    // if the count of an elements is greater than one, then we have duplicate
    if(x.Count(n => n == i) > 1)
    {
        y[counter] = i;
        counter++;
    }