【问题标题】:How do I prevent from writing a number that is already written?如何防止写入已经写入的数字?
【发布时间】:2018-01-25 15:45:28
【问题描述】:

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

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");
}

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

【问题讨论】:

  • 请贴出编译代码!
  • 使用HashSet<T>
  • 该 Array.IndexOf() 调用搜索整个数组,而不仅仅是已经输入的部分。所以你永远不能输入 0。ericlippert.com/2014/03/05/how-to-debug-small-programs
  • 或者你可以在这里修正你的逻辑并且将数字存储在数组中直到之后你已经测试了它是否存在于数组中?
  • @FrankerZ 在我的编辑中没有任何代码更改功能。我在 if 中添加了{} 以使其更好读。除非您在 C# 编译器中发现了使其功能不同的巨大缺陷?

标签: c# arrays


【解决方案1】:

使用哈希集,对每个新数字进行检查。

如果它已经存在于哈希集中,忽略它

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

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)
  • 这是一个非常明确的哈希集用例。

【讨论】:

  • 这很简约。您应该发布一些代码来显示您之前提到的内容。
  • 答案是对的,但你需要付出更多的努力。与简单的评论相比,您没有增加任何额外的好处。
  • 没错,如果你想从评论者那里获得积分,那么你必须加倍努力,stackoverflow 101。
  • @AhmedKamal 签出dotnetfiddle,让编写快速答案变得容易
  • @EndritShabani 我不认为你可以使用 SO 来获得作业的答案 ;)
【解决方案2】:

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

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

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;
}

【讨论】:

  • 啊,我知道今天是downvote_without_any_cmets 日...那我在哪里失败了?我不应该通过发布此答案来鼓励此类问题吗?
【解决方案3】:
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,请尝试这样的操作。

【讨论】:

  • HashSet 比这更快,并且使用适当的类型。为什么您的回答对 OP 有好处?为什么他们会/应该避免使用 HashSet?
  • 没错,我宁愿使用 HashSet,但我想表明可以使用现有的数据结构来做到这一点。
  • @maccettura 我们还没学过HashSet所以我不能用它
  • 哦,这看起来很眼熟;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多