我正在尝试编写一个算法来从特定索引的名称列表中删除名称。最初我会逐行读取文件。该文件将是这样的:
amelie barbon cat dog thomas | 3
raty pertw ituy |5
现在我们看到第一行我们最后有三(3)个,所以这里我们必须要读取每行的最后一个数字,这个数字是blackNumber
,因此在阅读之后这个数字我们必须逐个删除这个索引处的每个字符串,直到我们在字符串数组中留下1个字符串。只留下字符串是我们的答案。
例如:
Cat
将在第一次迭代中删除,列表将变为
amelie barbon dog thomas
现在dog
将被删除,然后thomas
,在这两个类似的删除后,列表将是:
amelie barbon
到此为止我的代码工作正常,但现在我们必须删除索引3和 但是列表中只有2个元素,所以下一个删除计数器必须像这样开始:
amelie(index:1)-> barbon(index:2)->amelie(index:3)
必须删除字符串amelie
,该列表将保留在列表中barbon
,而答案是。{ (当列表元素的总数少于blackNumber时,这最后一步,那么我无法得到如何做的逻辑。)
我尝试过的是:(当列表数小于blackNumber
时,它将无限运行)
class Program
{
static void Main(string[] args)
{
using (StreamReader reader = File.OpenText("C:\\Users\\Mohit\\Desktop\\PolmStudio Tasks\\anmeDelete\\anmeDelete\\file.txt"))
while (!reader.EndOfStream)
{
List<string> list = null;
string line = reader.ReadLine(); ;
if (null != line)
{
list = new List<string>();
string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < digits.Count() - 1; i++)
{
list.Add(digits[i]);
}
int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]) - 1;
do
{
for (int i = 0; i < list.Count(); i++)
{
if (i == blacknumber)
{
list.RemoveAt(i);
}
}
} while (list.Count > 1);
}
foreach (string str in list)
{
Console.WriteLine(str);
}
Console.WriteLine("");
}
Console.ReadKey();
}
}
答案 0 :(得分:2)
我认为,您正在寻找的是%
n
的模length
由于您使用List进行操作,因此您可以执行以下操作:
int listIndex = i % list.Count;
我相信它可以按你的需要做。模数将返回除法的剩余部分,因此返回您要查找的索引。
答案 1 :(得分:1)
这是一个简单的数学。假设您的列表长度为3
。并且您想要删除5th
元素。
5 % (3 - 1) = 1
。所以你必须删除索引1
的项目,即2nd
元素。
如果您要删除的元素的索引小于列表的数量,那么您通常会将其删除。
List<string> list = new List<string>{"amelie", "barbon", "cat", "dog", "thomas"};
int blacknumber = 3;
blacknumber--; // because indexes are 0 based
do
{
list.RemoveAt(blacknumber < list.Count ? blacknumber : blacknumber % list.Count);
} while (list.Count > 1);
Console.WriteLine(list[0]); // prints barbon
旁注:
不要使用 Count()
因为它从linq调用Enumerable.Count。它不是最佳的。您可以直接使用列表的属性。 list.Count
(无括号。)
答案 2 :(得分:1)
我有一个更简单的解决方案。根据你的问题,我不知道的唯一一个案例是,如果blackNumber是1,会发生什么。答案是amelia还是thomas?
继承我的代码
var arr = new List<string>() { "amelie", "barbon", "cat", "dog", "thomas" };
var goal = blackline - 2;
if (goal > -1)
{
if (arr.Count > goal)
{
Console.WriteLine(arr[goal]);
}
else
{
Console.WriteLine(arr[arr.Count - 1]);
}
}
else
{
Console.WriteLine(arr[0]); //if blackline is 1 and answer is suppose to be amelia
//Console.WriteLine(arr[arr.Count - 1]); //If blackline is 1 and answer is suppose to be thomas
}
答案 3 :(得分:1)
只需将内循环更改为以下内容即可获得所需答案:
do
{
int i =0;
if (blacknumber >= list.Count()) i = blacknumber % list.Count();
else i = blacknumber;
list.RemoveAt(i);
} while (list.Count > 1);
答案 4 :(得分:1)
感谢您给出的建议和解决方案,您的建议让我知道我无法更改要删除的列表项位置,但我可以使用%
运算符更改blackNumber,所以很多朋友都让我了解了如何感谢他们,但每个人的算法都缺少一些条件。以下是实现所有必要条件的工作解决方案:
string line = reader.ReadLine();
if (null != line)
{
list = new List<string>();
string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < digits.Count() - 1; i++)
{
list.Add(digits[i]);
}
int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]);
int saveBlackNum = blacknumber;
do
{
for (int i = 0; i < list.Count(); i++)
{
if ((list.Count < (blacknumber)))
{
if(blacknumber % list.Count==0 )
{
blacknumber = list.Count();
}
else
{
blacknumber = ((blacknumber) % list.Count());
}
break;
}
if ((list.Count >= (blacknumber)))
{
if (i == blacknumber - 1)
{
list.RemoveAt(blacknumber - 1);
blacknumber = saveBlackNum;
break;
}
}
}
} while (list.Count > 1);
}
foreach (string str in list)
{
Console.WriteLine(str);
}
Console.WriteLine("");
将来可能对其他人有帮助。
答案 5 :(得分:-1)
我无法理解你想要的东西,这是你想要的吗?如果该行中的项目少于黑名单,则停止删除项目? 'if(i == blacknumber&amp;&amp; list.Count&gt; = blacknumber)'