string[]
関数呼び出しから返されるC#の配列を使用しています。コレクションにキャストすることもできますがGeneric
、おそらく一時配列を使用して、それを行うためのより良い方法があるかどうか疑問に思いました。
C#配列から重複を削除するための最良の方法は何ですか?
string[]
関数呼び出しから返されるC#の配列を使用しています。コレクションにキャストすることもできますがGeneric
、おそらく一時配列を使用して、それを行うためのより良い方法があるかどうか疑問に思いました。
C#配列から重複を削除するための最良の方法は何ですか?
LINQクエリを使用してこれを行うことができます。
int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
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 がそのバージョンまで追加されなかったためです。LINQ の機能であるarray.Distinct()を使用することもできます。
次のテスト済みの動作中のコードは、配列から重複を削除します。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]);
}
必要に応じて、これを関数にまとめることができます。
並べ替える必要がある場合は、重複を削除する並べ替えを実装できます。
その後、1つの石で2羽の鳥を殺します。
これは、ソリューションをどの程度設計したいかによって異なる場合があります。配列がそれほど大きくならず、リストの並べ替えを気にしない場合は、次のようなことを試してください。
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));
}
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 != '\0')
{
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] = '\0';
}
}
上記のhash/linqアプローチは、実生活で一般的に使用されるものです。ただし、インタビューでは、通常、ハッシュを除外する一定のスペースや、 LINQの使用を除外する内部APIなしなど、いくつかの制約を課したいと考えています。
protected void Page_Load(object sender, EventArgs e)
{
string a = "a;b;c;d;e;v";
string[] b = a.Split(';');
string[] c = b.Distinct().ToArray();
if (b.Length != c.Length)
{
for (int i = 0; i < b.Length; i++)
{
try
{
if (b[i].ToString() != c[i].ToString())
{
Response.Write("Found duplicate " + b[i].ToString());
return;
}
}
catch (Exception ex)
{
Response.Write("Found duplicate " + b[i].ToString());
return;
}
}
}
else
{
Response.Write("No duplicate ");
}
}
すべての文字列を辞書に追加し、後で Keys プロパティを取得します。これにより、それぞれの一意の文字列が生成されますが、元の入力と同じ順序であるとは限りません。
最終結果を元の入力と同じ順序にする必要がある場合は、各文字列の最初の出現を考慮するときに、代わりに次のアルゴリズムを使用します。
最後に、リストにはそれぞれの一意の文字列の最初の出現が含まれます。
辞書を作成するときは、文化などを考慮して、アクセント付きの文字を含む重複を正しく処理するようにしてください。
次のコードでは、ArrayList から重複を削除しようとしていますが、これは最適な解決策ではありません。インタビュー中に、再帰によって重複を削除し、2番目/一時的な配列リストを使用せずに次の質問を受けました。
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);
}
}
重複した要素を保存せず、重複を追加するリクエストを静かに無視するハッシュセットかもしれません。
static void Main()
{
string textWithDuplicates = "aaabbcccggg";
Console.WriteLine(textWithDuplicates.Count());
var letters = new HashSet<char>(textWithDuplicates);
Console.WriteLine(letters.Count());
foreach (char c in letters) Console.Write(c);
Console.WriteLine("");
int[] array = new int[] { 12, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 };
Console.WriteLine(array.Count());
var distinctArray = new HashSet<int>(array);
Console.WriteLine(distinctArray.Count());
foreach (int i in distinctArray) Console.Write(i + ",");
}
注:テストされていません!
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();
}
あなたが必要とすることをするかもしれません...
編集ああああ!!! 1分以内に強盗に殴られた!
このコードは、配列から重複する値を 100% 削除します [[i] を使用したため] .....任意の OO 言語で変換できます..... :)
for(int i=0;i<size;i++)
{
for(int j=i+1;j<size;j++)
{
if(a[i] == a[j])
{
for(int k=j;k<size;k++)
{
a[k]=a[k+1];
}
j--;
size--;
}
}
}
以下をテストして動作します。クールなのは、文化に敏感な検索も行うことです
class RemoveDuplicatesInString
{
public static String RemoveDups(String origString)
{
String outString = null;
int readIndex = 0;
CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;
if(String.IsNullOrEmpty(origString))
{
return outString;
}
foreach (var ch in origString)
{
if (readIndex == 0)
{
outString = String.Concat(ch);
readIndex++;
continue;
}
if (ci.IndexOf(origString, ch.ToString().ToLower(), 0, readIndex) == -1)
{
//Unique char as this char wasn't found earlier.
outString = String.Concat(outString, ch);
}
readIndex++;
}
return outString;
}
static void Main(string[] args)
{
String inputString = "aAbcefc";
String outputString;
outputString = RemoveDups(inputString);
Console.WriteLine(outputString);
}
}
--AptSenSDET
ArrayList を操作するときにこのコードを使用できます
ArrayList arrayList;
//Add some Members :)
arrayList.Add("ali");
arrayList.Add("hadi");
arrayList.Add("ali");
//Remove duplicates from array
for (int i = 0; i < arrayList.Count; i++)
{
for (int j = i + 1; j < arrayList.Count ; j++)
if (arrayList[i].ToString() == arrayList[j].ToString())
arrayList.Remove(arrayList[j]);
public static int RemoveDuplicates(ref int[] array)
{
int size = array.Length;
// if 0 or 1, return 0 or 1:
if (size < 2) {
return size;
}
int current = 0;
for (int candidate = 1; candidate < size; ++candidate) {
if (array[current] != array[candidate]) {
array[++current] = array[candidate];
}
}
// index to count conversion:
return ++current;
}
int size = a.Length;
for (int i = 0; i < size; i++)
{
for (int j = i + 1; j < size; j++)
{
if (a[i] == a[j])
{
for (int k = j; k < size; k++)
{
if (k != size - 1)
{
int temp = a[k];
a[k] = a[k + 1];
a[k + 1] = temp;
}
}
j--;
size--;
}
}
}