我正在制作一个循环来搜索数组中的值。如果我找到它,将打印该位置,如果它不是"没有这样的号码"将被打印。 但是,如果我有几个相同的数字,我将只收到一个,然后我就在循环中。如果数组中的数字相同,我怎样才能获得控件? 我最好的尝试从一开始就以无限循环或完成循环结束。
static public void Searching(int[] arr)
{
string x = "yes";
Console.WriteLine("Enter please searching number");
while (x == "yes")
{
bool found = false;
int target = Convert.ToInt32(Console.ReadLine());
int searchkey = target;
int mid = 0, first = 0, last = arr.Length - 1;
while (!found && first <= last)
{
mid = (first + last) / 2;
if (target == arr[mid])
found = true;
else
{
if (target > arr[mid])
{
first = mid + 1;
}
if (target < arr[mid])
{
last = mid - 1;
}
}
}
String foundmsg = found
? "Item " + searchkey + " was found at position " + mid
: "Item " + searchkey + " was not found";
Console.WriteLine(foundmsg);
Console.WriteLine("would you like to find another number?");
x = Console.ReadLine();
}
}
答案 0 :(得分:1)
如果您要查找数组中找到特定值的所有位置,请创建一个列表(如List<int>
),当您在数组中找到数字时,添加位置到列表。这样您就可以搜索整个数组而不会中断循环。
然后,当您执行完后,列表中将有一个或多个项目,或者列表将为空。如果列表中有项目显示那些。如果列表中没有项目,则返回&#34; not found&#34;消息。
例如,
var indexes = new List<int>();
for(var index = 0; index < source.Length; index++)
{
if(source[index] == target) indexes.Add(index);
}
当你完成后,你会有一个匹配列表或一个空列表。
许多嵌套循环可能会让人感到困惑。您有一个处理控制台输入的外部循环。使更容易阅读的一种方法是将零件隔离到一个函数中。例如,
List<int> GetIndexesOfMatchingNumbers(int[] source, int target)
{
var indexes = new List<int>();
for(var index = 0; index < source.Length; index++)
{
if(source[index] == target) indexes.Add(index);
}
}
您可以从&#34; main&#34;中调用此功能。功能。它在功能上完全相同,但它减少了阅读代码时必须遵循的逻辑量。即使是写作者也很容易理解。
答案 1 :(得分:0)
不要循环这个。 C#内置了一些功能来帮助您。
static public void Searching(int[] arr)
{
string x = "yes";
Console.WriteLine("Please enter a number for which to search...");
int target = Convert.ToInt32(Console.ReadLine());
string Response = "Result of search is:"
+ arr.IndexOf(target) != -1
? arr.IndexOf(target).ToString() : "Not Found";
//indexOf finds the first index of obj. in array
Console.WriteLine(Response);
}
这应该满足你的#34;当我找到一个倍数时,我只收到一个&#34;需求。你总会第一次出现。
如果您需要所有实例并使用循环,那就完全不同了。
static public void Searching(int[] arr)
{
string x = "yes";
Console.WriteLine("Please enter a number for which to search...");
int target = Convert.ToInt32(Console.ReadLine());
string result = string.Empty
for(int i =0; i < arr.Length; i++)
if (i = target)
{ result += i.ToString() + ", " }
}
if(result != string.Empty)
{
result = result.SubString(0, result.Length - 2);
//removes extra space and colon
} else {
result = "Not Found";
}
Console.WriteLine("Result of search is:"
+ result);
}
答案 2 :(得分:0)
您可以尝试使用Array.BinarySearch
来查找某些项目的索引,然后从索引移动向后和转发 :
int[] source = new[] { 1, 2, 3, 4, 4, 4, 4, 5, 15, 20 };
int searchkey = 4;
int first = -1;
int last = -1;
int index = Array.BinarySearch(source, searchkey);
if (index >= 0) {
first = index;
last = index;
for (int i = index - 1; i >= 0; --i)
if (source[i] != toFind)
break;
else
first = i;
for (int i = index + 1; i < source.Length; ++i)
if (source[i] != toFind)
break;
else
last = i;
if (first == last)
Console.Write($"{searchkey} found at {first} position");
else
Console.Write($"{searchkey} found at [{first}..{last}] positions");
}
else
Console.Write($"{searchkey} is not found");