235

string[]関数呼び出しから返されるC#の配列を使用しています。コレクションにキャストすることもできますがGeneric、おそらく一時配列を使用して、それを行うためのより良い方法があるかどうか疑問に思いました。

C#配列から重複を削除するための最良の方法は何ですか?

4

28 に答える 28

474

LINQクエリを使用してこれを行うことができます。

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
于 2008-08-13T12:03:05.940 に答える
56

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()を使用することもできます。

于 2008-08-13T13:50:14.383 に答える
12

次のテスト済みの動作中のコードは、配列から重複を削除します。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]);
}

必要に応じて、これを関数にまとめることができます。

于 2008-08-13T13:04:51.290 に答える
11

並べ替える必要がある場合は、重複を削除する並べ替えを実装できます。

その後、1つの石で2羽の鳥を殺します。

于 2008-08-13T11:51:52.407 に答える
9

これは、ソリューションをどの程度設計したいかによって異なる場合があります。配列がそれほど大きくならず、リストの並べ替えを気にしない場合は、次のようなことを試してください。

    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));
    }
于 2008-08-13T13:08:28.383 に答える
8
List<String> myStringList = new List<string>();
foreach (string s in myStringArray)
{
    if (!myStringList.Contains(s))
    {
        myStringList.Add(s);
    }
}

これはO(n^2)であり、コンボに詰め込まれる短いリストでは問題になりませんが、大きなコレクションでは急速に問題になる可能性があります。

于 2008-08-13T14:19:38.427 に答える
7

これは、 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なしなど、いくつかの制約を課したいと考えています。

于 2009-12-06T17:50:22.073 に答える
6
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 ");
    }
}
于 2012-02-14T06:07:27.103 に答える
5

すべての文字列を辞書に追加し、後で Keys プロパティを取得します。これにより、それぞれの一意の文字列が生成されますが、元の入力と同じ順序であるとは限りません。

最終結果を元の入力と同じ順序にする必要がある場合は、各文字列の最初の出現を考慮するときに、代わりに次のアルゴリズムを使用します。

  1. リスト(最終出力)と辞書(重複をチェックするため)を用意する
  2. 入力の各文字列について、辞書に既に存在するかどうかを確認します
  3. そうでない場合は、辞書とリストの両方に追加します

最後に、リストにはそれぞれの一意の文字列の最初の出現が含まれます。

辞書を作成するときは、文化などを考慮して、アクセント付きの文字を含む重複を正しく処理するようにしてください。

于 2008-08-13T12:53:33.233 に答える
5

次のコードでは、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);
            }
        }
于 2010-04-15T09:31:27.883 に答える
5

重複した要素を保存せず、重複を追加するリクエストを静かに無視するハッシュセットかもしれません。

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 + ",");
}
于 2012-12-21T20:33:57.970 に答える
4

注:テストされていません!

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分以内に強盗に殴られた!

于 2008-08-13T13:09:23.233 に答える
4

このコードは、配列から重複する値を 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--;
        }
    }

}
于 2014-07-05T14:14:47.693 に答える
4

以下をテストして動作します。クールなのは、文化に敏感な検索も行うことです

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

于 2013-06-15T07:18:39.957 に答える
1

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]);
于 2015-04-12T09:12:09.183 に答える
1
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;
}
于 2016-02-02T05:21:18.120 に答える
0
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--;
                }
            }
        }
于 2020-06-06T23:58:18.570 に答える