亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 C# 中消除二維數組中的重復項

如何在 C# 中消除二維數組中的重復項

C#
長風秋雁 2022-12-24 12:46:46
剛開始學習編程,我需要沒有重復的二維數組。這段代碼(為 1D 編輯得很好)在 1D 上工作得很好,但在 2D 上卻不行,也不知道為什么。如果有人幫助我,我會很高興。謝謝。        Random r = new Random();        int[,] array = new int[10, 8];        for (int i = 0; i < array.GetLength(0); i++)        {            for (int j = 0; j < array.GetLength(1); j++)            {                array[i, j] = r.Next(10, 100);                for (int k = 0; k < i; k++)                {                    for (int l = 0; l < j; l++)                    {                        if (array[i,j] == array[k,l])                        {                            i--;                            j--;                            break;                        }                    }                }            }        }
查看完整描述

3 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

使用嵌套j循環,您將為每個填充整個第二個維度i,但在k和l循環中,您只檢查當前單元格左上角的網格。您可以放置一個數字兩次,因為您沒有檢查每個以前填充的位置。


如果我們把代碼改成這樣:


        for (int k = 0; k < array.GetLength(0); k++)

        {

            for (int l = 0; l < array.GetLength(1); l++)

            {

                if (i != k && j != l && array[i, j] == array[k, l])

                {

                    i--;

                    j--;

                    break;

                }

            }

        }

然后你消除了那個問題,但你很快發現你得到了一個IndexOutOfRangeException,因為你同時遞減了兩個i& j。這并沒有將您移動到以前的值 - 它跳回一整行并留下一個單元格 - 最終發送i或發送j到-1,這并不好。


如果您想像嘗試那樣做,那么您需要有一種方法可以簡單地移回先前填充的單元格,而不管您所在的行或列如何。


試試這個:


for (int x = 0; x < array.GetLength(0) * array.GetLength(1); x++)

{

    array[x % array.GetLength(0), x / array.GetLength(0)] = r.Next(10, 100);

    for (int y = 0; y < x; y++)

    {

        if (array[x % array.GetLength(0), x / array.GetLength(0)] == array[y % array.GetLength(0), y / array.GetLength(0)])

        {

            x--;

            break;

        };

    }

}

但是,這不是很有效。試試這個:


var values = Enumerable.Range(10, 90).OrderBy(_ => r.Next()).ToArray();


for (int x = 0; x < array.GetLength(0) * array.GetLength(1); x++)

{

    array[x % array.GetLength(0), x / array.GetLength(0)] = values[x];

}


查看完整回答
反對 回復 2022-12-24
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

所以,首先,這似乎效率低下。不知道你為什么要這樣做,但話又說回來,不知道原因??雌饋硐褚粋€編程任務。

我猜,你需要某種雙重休息。當您中斷查找匹配項時,您不會中斷到“k”for 循環,因此即使您找到了一個匹配項,您仍會繼續查找匹配項。嘗試設置一個布爾值來表示已找到,然后在 k 的 for 循環的條件中使用它。這將打破它,讓你重新開始 i 和 j 的外部循環。

即使那樣,它也不會起作用,因為您不加選擇地減去了 i 和 j。因此,如果您位于位置 1,2,您將跳回到 0,1 而不是 1,2。所以你需要減去j,如果它降到0以下,然后從i中減去并將“array.GetLength(1)”添加到j。


查看完整回答
反對 回復 2022-12-24
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

此解決方案取決于HashSet包含唯一元素的屬性。它有一個Add方法,false當我們嘗試添加現有元素時返回。

Random r = new Random();

int[,] array = new int[10, 8];

var usedValues = new HashSet<int>();


for (int i = 0; i < array.GetLength(0); i++)

{

    for (int j = 0; j < array.GetLength(1); j++)

    {

        int uniqueValue;

        while (true)

        {

            uniqueValue = r.Next(10, 100);

            if (usedValues.Add(uniqueValue)) break; // It is unique indeed

            // It is not unique, try again.

        }

        array[i, j] = uniqueValue;

    }

}

當可接受的唯一值范圍較大時,上述解決方案更適用。在這種特定情況下,范圍非常?。?0-99),@Enigmativity 提供的解決方案更可取。



查看完整回答
反對 回復 2022-12-24
  • 3 回答
  • 0 關注
  • 291 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號