如何防止编写已编写的数字?

时间:2018-01-25 15:45:29

标签: c# arrays

如何阻止用户编写数组中已存在的数字? 我试过这个:

int[] number = new int[5];
for ( int i=0; i<number.Length; i++)
{
    Console.Write("Write a number : );
    number[i] = int.Parse(Console.ReadLine());
    int getindex = Array.IndexOf(number, number[i]);
    if (number[i] == number[getindex])
        Console.WriteLine("This number already exists");
}

但是,当我第一次写它时,它说它已经存在,所以它不起作用。

3 个答案:

答案 0 :(得分:2)

使用哈希集,对于每个新号码,请检查。

如果它已经存在于hashset中,请忽略它

否则将其添加到哈希集并打印它

int[] numbers = new int[100];

HashSet<int> uniqueNums = new HashSet<int>();
for (int i=0; i < numbers.Length; i++)
{
    int number = int.Parse(Console.ReadLine());

    bool isNew = uniqueNums.Add(number);
    if(!isNew) {
      Console.WriteLine("This number already exists");
    } 
}

编辑:感谢@maccettura提供此提示,我们甚至不需要包含方法

为何选择此解决方案?

  • 它更清洁,你不必关心指数。
  • 它更快,在O(1)中你会得到你的查找,而迭代意味着丑陋的O(n)
  • 这是散列集的一个非常明确的用例。

答案 1 :(得分:0)

  

但是,当我第一次写它时,它说它已经存在,所以它不起作用。

您将数字放入数组中,然后检查它是否存在!当然它就在那里,你只需把它放在那里。看到这些twolines:

number[i] = int.Parse(Console.ReadLine());
if (number[i] == number[getindex])

您仍处于i

位置
  

如何阻止用户编写数组中已存在的数字?

实际上,在通过使用局部变量来捕获输入来检查存在之前,首先需要防止自己编写:

int localnumber = int.Parse(Console.ReadLine());

如果数字不存在,则IndexOf将返回-1

  

返回值
  类型:System.Int32
  如果找到,则整个数组中第一次出现值的从零开始的索引;否则,-1。

所以你可以检查一下:

int getindex = Array.IndexOf(number, localnumber );
if (getindex == -1)
{
    Console.WriteLine("This number already exists Try again please");
    // then you count i one position back so that the next valid number is inserted on the correct position
    i--;
}
else
{
    number[i] = localnumber;
}

答案 2 :(得分:-2)

var number = new int[10];
for (int i = 0; i < number.Length; i++)
{
    Console.Write("Write a number : ");
    int x = int.Parse(Console.ReadLine());
    if (number.Contains(x))
    {
        Console.WriteLine("This number already exists");
        i--; // retry for this index
    }
    else
    {
        number[i] = x;
    }
}

如果您不想使用HashSet,请尝试这样的操作。