计算列表中相似的相邻项目<string>
Count similar adjacent items in List<string>
我试图在列表中找到相似的相邻项目并计算其数量,例如:
List<string> list = new List<string> {"a", "a", "b", "d", "c", "c"};
期望的输出:
a = 2, c = 2
我所做的是使用 for 循环遍历列表的每个元素并查看它是否具有相似的相邻元素,但可以理解它给出 ArgumentOutOfRangeException()
因为我不知道如何保持跟踪迭代器的位置,使其不会越界。这是我所做的:
for (int j = 0; j < list.Count; j++)
{
if (list[j] == "b")
{
if ((list[j + 1] == "b") && (list[j - 1] == "b"))
{
adjacent_found = true;
}
}
}
话虽如此,如果除了使用for循环迭代之外,还有其他更简单的方法来查找List中的相似相邻元素,请指教。谢谢。
你可以这样做:
static IEnumerable<Tuple<string, int>> FindAdjacentItems(IEnumerable<string> list)
{
string previous = null;
int count = 0;
foreach (string item in list)
{
if (previous == item)
{
count++;
}
else
{
if (count > 1)
{
yield return Tuple.Create(previous, count);
}
count = 1;
}
previous = item;
}
if (count > 1)
{
yield return Tuple.Create(previous, count);
}
}
for (int i= 0; i < list.Count; i++)
{
for (int j = i + 1; j < list.Count; j++)
{
if (list[i] == list[j])
{
adjacent_found = true;
count++;
}
}
}
检查这个:
Dictionary<char,int> dic=new Dictionary<char,int>();
for(int i=1;i<list.count;i++)
{
if(list[i]==list[i-1])
{
if(dic.ContainsKey(list[i]))
{
dic[list[i]]+=1;
}
else
{
dic.Add(list[i],2)
}
}
}
为避免 ArgumentOutOfRangeException
使用 for (int j = 1; j < list.Count - 1; j++)
。无法通过这种方式获得所需的答案。试试这个:
IEnumerable<Adjacent> CountAdjacents(List<string> source)
{
var result = new List<Adjacent>();
for (var i = 0; i < source.Count() - 1; i++)
{
if (source[i] == source[i + 1])
{
if (result.Any(x => x.Word == source[i]))
{
result.Single(x => x.Word == source[i]).Quantity++;
}
else
result.Add(new Adjacent
{
Word = source[i],
Quantity = 2
});
}
}
return result;
}
class Adjacent
{
public string Word;
public int Quantity;
}
维护一个 256 大小的 int 数组,初始化为 1。运行 循环 [O(n)] for i=0 到 i-2,将每个字符与下一个字符进行比较。如果相同则找到 char 的 ascii 值并增加数组中的相应值。
希望这对您有所帮助!
我试图在列表中找到相似的相邻项目并计算其数量,例如:
List<string> list = new List<string> {"a", "a", "b", "d", "c", "c"};
期望的输出:
a = 2, c = 2
我所做的是使用 for 循环遍历列表的每个元素并查看它是否具有相似的相邻元素,但可以理解它给出 ArgumentOutOfRangeException()
因为我不知道如何保持跟踪迭代器的位置,使其不会越界。这是我所做的:
for (int j = 0; j < list.Count; j++)
{
if (list[j] == "b")
{
if ((list[j + 1] == "b") && (list[j - 1] == "b"))
{
adjacent_found = true;
}
}
}
话虽如此,如果除了使用for循环迭代之外,还有其他更简单的方法来查找List中的相似相邻元素,请指教。谢谢。
你可以这样做:
static IEnumerable<Tuple<string, int>> FindAdjacentItems(IEnumerable<string> list)
{
string previous = null;
int count = 0;
foreach (string item in list)
{
if (previous == item)
{
count++;
}
else
{
if (count > 1)
{
yield return Tuple.Create(previous, count);
}
count = 1;
}
previous = item;
}
if (count > 1)
{
yield return Tuple.Create(previous, count);
}
}
for (int i= 0; i < list.Count; i++)
{
for (int j = i + 1; j < list.Count; j++)
{
if (list[i] == list[j])
{
adjacent_found = true;
count++;
}
}
}
检查这个:
Dictionary<char,int> dic=new Dictionary<char,int>();
for(int i=1;i<list.count;i++)
{
if(list[i]==list[i-1])
{
if(dic.ContainsKey(list[i]))
{
dic[list[i]]+=1;
}
else
{
dic.Add(list[i],2)
}
}
}
为避免 ArgumentOutOfRangeException
使用 for (int j = 1; j < list.Count - 1; j++)
。无法通过这种方式获得所需的答案。试试这个:
IEnumerable<Adjacent> CountAdjacents(List<string> source)
{
var result = new List<Adjacent>();
for (var i = 0; i < source.Count() - 1; i++)
{
if (source[i] == source[i + 1])
{
if (result.Any(x => x.Word == source[i]))
{
result.Single(x => x.Word == source[i]).Quantity++;
}
else
result.Add(new Adjacent
{
Word = source[i],
Quantity = 2
});
}
}
return result;
}
class Adjacent
{
public string Word;
public int Quantity;
}
维护一个 256 大小的 int 数组,初始化为 1。运行 循环 [O(n)] for i=0 到 i-2,将每个字符与下一个字符进行比较。如果相同则找到 char 的 ascii 值并增加数组中的相应值。 希望这对您有所帮助!