我创建了一个程序,用于检查项目在数组中重复的次数。
但是,对于每个重复至少两次的项目,我想将其分配给变量。我的问题是,我的名单有时可能更大或更小。所以我需要我的循环通过,如果找到副本,创建一个int类型的变量并为其分配重复次数。我似乎记得在Java上读过关于这个的东西,但我忘记了它的名字,或者我只是感到困惑。请帮忙。谢谢。
更新:我希望输出如下:
(A:20) - (B:114) - (C:50) - (W:0)
目前我正在尝试检查是否
string[] art = new string[] {"ABAR 200", "CDXE 500", "BKWR 250", "BTSQ 890", "DRTY 600"};
string[] cd = new string[] {"A", "B"};
int control = 0;
//I will fill this in the first loop below with
//the first letter of each item in the art array
ArrayList firstLetter = new ArrayList ();
//this one gets filled after the second loop ends
ArrayList numOfLetters = new ArrayList ();
for(int k = 0; k < art.Length; k++){ //iterate 4 times, add 1st letter
firstLetter.Add (art[k].Substring(0, 1));
}
for (int j = 0; j < art.Length; j++) { //iterate 4 times
//check how many times a letter repeats in 'art'
while (firstLetter.Contains (art [j].Substring (0, 1))) {
control++; //
}
numOfLetters.Add ("(" + art [j].Substring (0, 1) + " " + ":" + " " +
control + ")");
control = 0;
}
print (numOfLetters[0]);
如果这一切都没有意义,我很乐意知道如何检查一个arraylist一封信重复多少次。
I,E;
的ArrayList 一个 乙 C 一个 d 一个 Ë ˚F
我想知道如何检查'A'重复多少次
答案 0 :(得分:2)
我不太清楚代码块在做什么,所以我只是解决你的最后一个例子。首先,避免使用ArrayList
。您可以在其中存储任何object
,但您无法轻易告知对象的类型存储在其中。当您返回值时,您必须将它们取消装箱。这很痛苦。
相反,请使用样本中List<T>
T
为string
的{{1}}。
List<string> letters = new List<string> {"A", "B", "C", "A", "D", "A", "E", "F"};
使用LINQ(在您的情况下为字母)按值对原始数组进行分组,然后存储至少出现两次的任何值的计数。 (我修改了您的样本集以获得更多重复项。)
还有一个名为string.Join
的内置方法,它接受一个集合,将其展平为单个字符串,并用其他字符串(" - "
分隔集合的所有元素这里)。
var letters = new List<string> {"B", "A", "C", "A", "A", "B", "A", "B"};
var repeats = letters.GroupBy(i => i)
.Where(g => g.Count() >= 2)
.ToDictionary(t => t.Key, t => t.Count());
var output = string.Join(" - ", repeats.OrderBy(x => x.Key)
.Select(x => string.Format("({0} : {1})", x.Key, x.Value)));
// output: "(A : 4) - (B : 3)"
答案 1 :(得分:1)
听起来你可能正在寻找Dictionary<T, int>
。你没有提到数组中包含什么类型的项目,因此你想要将T
替换为该类型的任何类型。
快速而肮脏的实现可能如下所示:
Dictionary<object, int> dict = new Dictionary<object, int>();
object[] objs = new object[] { ... };
for (int v = 0; v < objs.Length; v++)
{
object obj = objs[v];
int count = dict.TryGet(obj, out count) ? count : 0;
dict[obj] = count + 1;
}
这听起来像CS家庭作业,所以我假设这可能是你正在寻找的,但如果这是用于制作,我很想用LINQ来做
Dictionary<object, int> dict = objs.GroupBy(c => c)
.ToDictionary(c => c.Key, c => c.Count());
一旦您获得了字典,只需检查多个项目的值即可。您可以通过使用foreach或使用LINQ循环来完成此操作。
这是另一个超快速实现,您可能希望采用不同的方式。但这将抓住它的主旨。
foreach (var v in dict.ToList())
{
if (v.Value < 2)
dict.Remove(v.Key);
}
另一种可行的方法是使用HashSet<>
,它一次只允许任何给定对象的一个实例。
object[] objs = new object[] { ... };
HashSet<object> buffer = new HashSet<object>();
HashSet<object> repeated = new HashSet<object>();
foreach (var v in objs)
{
if(!buffer.Add(v))
{
repeated.Add(v);
}
}
在这里,我遍历每个项目并将其添加到缓冲区HashSet<>
。如果返回false,则表示已经添加了它,因此它是重复的。那时,我将它追加到第二个HashSet<>
,这将是你的结果。我选择了List<>
作为结果,因为我假设您不希望重复报告,如果项目在数组中出现两次以上。但除此之外,两者都有效。
答案 2 :(得分:0)
您的项目类:
class YourItem
{
public int ItemId { get; set; }
public string ItemName { get; set; }
}
现在我们填写一些项目清单并进行处理:
// defining example item list
var items = new List<YourItem>() {
new YourItem() { ItemId = 1, ItemName = "FirstItem" },
new YourItem() { ItemId = 1, ItemName = "FirstItem" },
new YourItem() { ItemId = 2, ItemName = "SecondItem" } };
var groups = items.GroupBy(item => item.ItemId) // grouping your items by id (or how do you compare them?) to be able to count repetitions
.Where(group => group.Count() > 1) // filtering out those that are not repeated
.Select(group => new { Item = group.First(), Sum = group.Count() }); // selecting Item and Count for each group.
// processing the results
foreach (var group in groups)
{
Console.WriteLine(group.Item.ItemName + " " + group.Sum);
}
输出:
FirstItem 2