我有一個 6x6 字符的二維陣列,看起來像這樣,我試圖創建一個方法,女巫需要用“@”字符替換行中的重復項
a b a a
a a b c
a a a b
a a a a
用方法替換后應該是這樣的
a b @ @
a @ b c
a @ @ b
a @ @ @
我已經嘗試過這種方法但沒有結果“我需要在沒有庫的情況下完成這項作業”
public void RemoveDuplicates(char[,] array)
{
char symbol = '@';
for (int i = 0; i < array.GetLength(0); i )
{
for (int j = 0; j < array.GetLength(1); j )
{
int temp = array[i, j];
int next = temp;
if(temp == next)
{
next = symbol;
}
}
}
}
uj5u.com熱心網友回復:
您可以使用 Hashset(或也列出)集合(檔案:https ://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/collections )來存盤您的重復項,如下所示:
var hash = new HashSet<char>();
for (int i = 0; i < array.GetLength(0); i )
{
for (int j = 0; j < array.GetLength(1); j )
{
if(!hash.Add(array[i,j])) array[i,j] = '@';
}
hash.Clear();
}
-----
Or list as follows:
var list = new List<char>();
for (int i = 0; i < array.GetLength(0); i )
{
for (int j = 0; j < array.GetLength(1); j )
{
if(!list.Contains(array[i,j])) list.Add(array[i,j]);
else array[i,j] = '@';
}
list.Clear();
}
uj5u.com熱心網友回復:
目標應該是跟蹤所有以前看到的角色。因此,您需要某種“集合”資料結構。簡單的方法是使用HashSet。這有一個 add 方法,可以將值添加到集合中,如果值已經在集合中,則回傳 false。
var seenCharacters = new HashSet<char>();
for (int j = 0; j < array.GetLength(1); j )
{
if(!seenCharacters.Add(array[i, j])){
array[i, j] = symbol;
}
}
HashSet 是框架的一部分,因此通常不會被視為“庫”。
如果現在允許這樣做,您可以使用普通陣列提供類似的功能。
var seenCharacters = new bool[(int)char.MaxValue];
for (int j = 0; j < array.GetLength(1); j )
{
var c = (int)array[i, j];
if(seenCharacters[c]){
array[i, j] = symbol;
}
seenCharacters[c] = true;
}
但我可能不會推薦這樣的解決方案,因為與 hashSet 相比,它使用了更多的記憶體。
uj5u.com熱心網友回復:
可能不是最快的解決方案,但很容易理解
var data = new char[,]
{
{ 'a', 'b', 'a', 'a' },
{ 'a', 'a', 'b', 'c' },
{ 'a', 'a', 'a', 'b' },
{ 'a', 'a', 'a', 'a' },
};
for (int i = 0; i < data.GetLength(0); i )
{
for (int j = 0; j < data.GetLength(1); j )
{
for (int k = data.GetLength(1) - 1; k > j; k--)
{
if (data[i, j] == data[i, k])
{
data[i, k] = '@';
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462427.html
