如何从C#数组中删除重复项?
我一直在使用从函数调用返回的C中的string []
数组。我可能会转换为"通用"集合,但我想知道是否有更好的方法可以做到这一点,可能是通过使用临时数组。
从Carray中删除重复项的最佳方法是什么?
解决方案
回答
如果我们需要对它进行排序,则可以实施一种排序,该操作还可以删除重复项。
然后用一块石头杀死两只鸟。
回答
我们可以使用LINQ查询来执行此操作:
int[] s = { 1, 2, 3, 3, 4}; int[] q = s.Distinct().ToArray();
回答
将所有字符串添加到字典中,然后获取Keys属性。这将产生每个唯一的字符串,但不一定要按照原始输入的顺序。
如果我们要求最终结果与原始输入具有相同的顺序,那么当我们考虑每个字符串的第一次出现时,请改用以下算法:
- 有一个列表(最终输出)和一个字典(检查重复项)
- 对于输入中的每个字符串,检查它是否已存在于字典中
- 如果不是,请将其添加到字典和列表中
最后,列表包含每个唯一字符串的第一次出现。
在构建字典时,请确保考虑诸如文化之类的问题,以确保正确处理带重音字母的重复项。
回答
以下经过测试且有效的代码将从数组中删除重复项。我们必须包括System.Collections命名空间。
string[] sArray = {"a", "b", "b", "c", "c", "d", "e", "f", "f"}; var sList = new ArrayList(); for (int i = 0; i < sArray.Length; i++) { if (sList.Contains(sArray[i]) == false) { sList.Add(sArray[i]); } } var sNew = sList.ToArray(); for (int i = 0; i < sNew.Length; i++) { Console.Write(sNew[i]); }
如果需要,可以将其包装为一个函数。
回答
如果阵列永远不会那么大,并且我们不关心对列表进行排序,那么这可能取决于我们要设计解决方案的量,我们可能想尝试类似于以下内容的方法:
public string[] RemoveDuplicates(string[] myList) { System.Collections.ArrayList newList = new System.Collections.ArrayList(); foreach (string str in myList) if (!newList.Contains(str)) newList.Add(str); return (string[])newList.ToArray(typeof(string)); }
回答
注意:未经测试!
string[] test(string[] myStringArray) { List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } } return myStringList.ToString(); }
可能会做我们需要的...
编辑啊!不到一分钟就被抢劫殴打了!
回答
这是HashSet <string>方法:
public static string[] RemoveDuplicates(string[] s) { HashSet<string> set = new HashSet<string>(s); string[] result = new string[set.Count]; set.CopyTo(result); return result; }
不幸的是,此解决方案还需要.NET Framework 3.5或者更高版本,因为直到该版本才添加HashSet。我们也可以使用array.Distinct(),这是LINQ的功能。
回答
List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } }
这是O(n ^ 2),对于将要填充到组合中的简短列表来说无关紧要,但是对于大集合而言可能会很快成为问题。
回答
这是使用O(1)空间的O(n * n)方法。
void removeDuplicates(char* strIn) { int numDups = 0, prevIndex = 0; if(NULL != strIn && *strIn != 'private void RemoveDuplicate() { ArrayList dataArray = new ArrayList(5); dataArray.Add("1"); dataArray.Add("1"); dataArray.Add("6"); dataArray.Add("6"); dataArray.Add("6"); dataArray.Add("3"); dataArray.Add("6"); dataArray.Add("4"); dataArray.Add("5"); dataArray.Add("4"); dataArray.Add("1"); dataArray.Sort(); GetDistinctArrayList(dataArray, 0); } private void GetDistinctArrayList(ArrayList arr, int idx) { int count = 0; if (idx >= arr.Count) return; string val = arr[idx].ToString(); foreach (String s in arr) { if (s.Equals(arr[idx])) { count++; } } if (count > 1) { arr.Remove(val); GetDistinctArrayList(arr, idx); } else { idx += 1; GetDistinctArrayList(arr, idx); } }') { int len = strlen(strIn); for(int i = 0; i < len; i++) { bool foundDup = false; for(int j = 0; j < i; j++) { if(strIn[j] == strIn[i]) { foundDup = true; numDups++; break; } } if(foundDup == false) { strIn[prevIndex] = strIn[i]; prevIndex++; } } strIn[len-numDups] = '##代码##'; } }
上面的hash / linq方法是我们在现实生活中通常会使用的方法。但是在面试中,他们通常想施加一些限制,例如排除哈希的常量空间,或者没有使用LINQ排除的内部api。
回答
下面的代码尝试从ArrayList中删除重复项,尽管这不是最佳解决方案。在面试中有人问我这个问题,以便通过递归删除重复项,而无需使用第二/临时数组列表:
##代码##