Introdução às matrizes 2D em C #
Matrizes bidimensionais são uma coleção de elementos homogêneos que se estendem por várias linhas e colunas, assumindo a forma de uma matriz. Abaixo está um exemplo de uma matriz 2D que possui m linhas e n colunas, criando assim uma matriz de configuração mxn.
( a1, a2, a3, a4, …, an
b1, b2, b3, b4, …, bn
c1, c2, c3, c4, …, cn
.
.
.
m1, m2, m3, m4, …, mn )
Conceito de matrizes irregulares
Uma matriz irregular é uma matriz de matrizes. Matrizes denteadas são essencialmente múltiplas matrizes denteadas juntas para formar uma matriz multidimensional. Uma matriz irregular bidimensional pode ser algo como isto:
( ( a1, a2, a3, a4, …, an ),
( b1, b2, b3, b4, …, b20 ),
( c1, c2, c3, c4, …, c30 ),
.
.
.
( m1, m2, m3, m4, …, m25 ) )
Observe que todas as linhas de uma matriz irregular podem ou não conter o mesmo número de elementos.
Matrizes 2D verdadeiras versus matrizes irregulares
Matrizes irregulares são completamente diferentes de uma matriz 2D verdadeira de uma perspectiva de implementação. É importante entender como o C # implementa matrizes multidimensionais e matrizes irregulares.
As linguagens de programação diferem na implementação de matrizes multidimensionais. Algumas linguagens de programação como C, C ++, C #, Fortran etc. suportam matrizes 2D verdadeiras. Embora existam outros que simulam esse comportamento com matrizes de matrizes, também conhecidas como matrizes irregulares. Então, como uma matriz bidimensional verdadeira é diferente de matrizes irregulares?
As duas implementações de matrizes multidimensionais são diferentes em termos de consumo de armazenamento. Enquanto uma matriz 2D verdadeira teria m linhas de n elementos cada, uma matriz irregular poderia ter m linhas cada uma com diferentes números de elementos. Isso leva a um espaço desperdiçado mínimo para conjuntos de dados. Portanto, a matriz abaixo-irregular é perfeitamente adequada:
int()() jagged array = ( (1, 2, 3, 4),
(5, 6, 7),
(8, 9) )
Se o mesmo conjunto de dados fosse implementado em uma matriz 2D verdadeira, teria sido o seguinte:
int(, ) multiDimArray = ( 1, 2, 3, 4
5, 6, 7, 0
8, 9, 0, 0 )
Operações em matrizes 2D em C #
Aqui, algumas operações em matrizes 2D fornecidas abaixo:
1. Construa a matriz C # 2D
Vamos ver uma maneira de declarar uma matriz 2D em C # e outra maneira de como não declarar uma matriz 2D em C #.
Como?
Uma implementação de matriz 2D verdadeira em C # começa com a declaração de matriz. Parece como abaixo:
int(, ) arr2D;
string(, ) arr2D_s;
O número de vírgulas na definição determina a dimensão da matriz. Observe que você não pode especificar o tamanho da matriz na declaração da matriz. Isso deve ser feito durante a inicialização de uma matriz.
Como não?
É fácil ficar confuso entre as implementações de matrizes 2D e matrizes irregulares. Uma declaração de matriz irregular se parece com:
int()() jagged array;
2. Inicialize a matriz 2D do C #
O próximo passo é inicializar a matriz 2D que acabamos de declarar. Existem várias maneiras de fazer isso.
Usando o novo operador
arr2D = new int(2, 3); //separate initialization
string(, ) arr2D_s = new string(4, 5); //with declaration
Inicializando com valores
//without dimensions
arr2D = new int(, )((1, 2), (3, 4), (5, 6));
//with declaration
arr2D_s = new string(2, 2)((“one”, ”two”), (“three”, “four”));
Sem o novo operador
Int(, ) arr2D_a = ((1, 2), (3, 4), (5, 6), (7, 8));
3. Leia os elementos da matriz C # 2D
Leia um único elemento
A próxima operação é ler os elementos da matriz 2D. Como a matriz 2D é uma matriz de elementos mxn, cada elemento possui uma combinação de índice de linha e índice de coluna designada. Podemos acessar os elementos fornecendo o índice de linha e o índice de coluna no subscrito. Um exemplo está abaixo:
int(, ) arr2D_i = ((1, 2), (3, 4), (5, 6), (7, 8));
string arr2D_s = ((“one”, ”two”), (“three”, “four”));
int val_i = arr2D_i(2, 1); //returns '6'
string val_s = arr2D_s(1, 1); //returns 'four'
Leia todos os elementos
Mas, o método acima nos fornece o valor de um único elemento na matriz. Como atravessamos toda a matriz para ler todos os elementos dela? A solução simples é percorrer toda a matriz usando loops for / while aninhados.
Código
using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < 3; i++)
(
for (int j = 0; j < 3; j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)
Resultado
O método GetLength ()
OK. Mas, o exemplo acima funciona apenas quando eu sei o número de elementos na matriz de antemão. E se minha matriz for dinâmica? Como atravessar todos os elementos de uma matriz dinâmica? Aí vem o método GetLength para nosso resgate.
int arr2D.GetLength (0); // retorna a primeira dimensão (linhas)
int arr2D.GetLength (1); // retorna a segunda dimensão (colunas)
Código
using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)
Resultado
O poder de cada loop
O loop for-each executa um conjunto de comandos para cada elemento da matriz. Este é um mecanismo de loop muito poderoso e é altamente recomendado, pois é mais eficiente do que um loop for tradicional.
Código
using System;
public class Program
(
public static void Main()
(
string(, ) arr2D_s = new string(3, 3)(("one", "two", "three"), ("four", "five", "six"), ("seven", "eight", "nine"));
//reading all the elements through foreach loop
foreach(var ele in arr2D_s)
(
Console.WriteLine(ele);
)
)
)
Resultado
4. Inserir elementos na matriz C # 2D
Agora vamos ver um exemplo de como inserir elementos em uma matriz C # 2D. A idéia é percorrer cada posição da matriz e atribuir um valor a ela.
Código
using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) squares = new int(3, 3);
int(, ) cubes = new int(3, 3);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
squares(i, j) = arr2D_i(i, j) * arr2D_i(i, j);
cubes(i, j) = squares(i, j) * arr2D_i(i, j);
)
)
Console.WriteLine("Squares\n");
DisplayArray(squares);
Console.WriteLine("\n\nCubes\n");
DisplayArray(cubes);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
( Console.Write(arr(i, j) + "\t"); )
Console.WriteLine("\n");
)
)
)
Resultado
5. Atualizar elementos na matriz C # 2D
Atualizaremos nossa matriz para multiplicar cada elemento com 2. A idéia é percorrer cada posição da matriz e atualizar o valor que ela possui.
Código
using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
arr2D_i(i, j) *= 2;
)
)
Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n");
DisplayArray(arr2D_i);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)
Resultado
6. Excluir elementos na matriz C # 2D
Esta é uma operação complicada. Não é possível excluir um único elemento de uma matriz C # 2D verdadeira. A exclusão de um único elemento perturba as dimensões da matriz, de forma que não seria mais uma matriz. O C # não permite isso, a menos que seja uma matriz irregular.
Então qual é a solução? Excluímos a linha inteira ou a coluna inteira? Não, o C # não permitiria isso também. A matriz é fixa em tamanho quando declarada ou inicializada. Ele corrigiu bytes de memória alocados. Não podemos mudar isso em tempo de execução.
A solução aqui é criar uma nova matriz sem os elementos que queremos excluir.
Código
using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) new_array = new int(2, 2);
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
int rowToDel = 2;
int colToDel = 2;
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
if(i==rowToDel)
continue;
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
if(j==colToDel)
continue;
new_array(i, j)=arr2D_i(i, j);
)
)
Console.WriteLine("\n\nArray after deleting elements\n");
DisplayArray(new_array);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)
Resultado
Conclusão
Assim, vimos como uma matriz 2D é implementada em C # e quais são as várias operações CRUD que podemos executar nela. Também aprendemos a diferença entre uma implementação 2D real e uma matriz irregular. Existem muito mais métodos disponíveis em C # para ajudar os desenvolvedores a trabalhar com Arrays à vontade. Verifique-os nos documentos do MSDN.
Artigos recomendados
Este é um guia para matrizes 2D em C #. Aqui discutimos o conceito de matrizes irregulares, juntamente com operações em matrizes 2D em C #. Você também pode consultar os seguintes artigos para saber mais:
- Matrizes 2D em Java
- Matrizes 2D em Python
- Matrizes em c #
- Matrizes em C ++
- Matrizes em PHP
- Gráficos 2D em Java
- Como matrizes e listas funcionam em Python?
- Matrizes multidimensionais em C ++ com exemplos
- Matrizes 2D em PHP