Pular para o conteúdo principal

Arrays

Arrays e listas são estruturas de dados fundamentais. Veja como diferentes linguagens lidam com criação, manipulação e iteração de arrays.

Criação e Inicialização de Arrays​

// Array literal
const arr = [1, 2, 3];

// Empty array
const empty = [];

// Array constructor
const arr2 = new Array(1, 2, 3);

// Array with size
const sized = new Array(5);

// Array methods
arr.push(4); // Add to end
arr.pop(); // Remove from end
arr.unshift(0); // Add to beginning
arr.shift(); // Remove from beginning

Manipulação de Arrays​

const arr = [1, 2, 3, 4, 5];

// Map
const doubled = arr.map(x => x * 2);

// Filter
const evens = arr.filter(x => x % 2 === 0);

// Reduce
const sum = arr.reduce((acc, x) => acc + x, 0);

// Find
const found = arr.find(x => x > 3);

// Slice
const slice = arr.slice(1, 3); // [2, 3]

// Sort
const sorted = [...arr].sort((a, b) => b - a);

Principais Conclusões​

  • Fixo vs dinâmico -- C, Zig e Go usam arrays de tamanho fixo (ex: int arr[3] em C, var arr = [_]i32{1,2,3} em Zig). JavaScript, Python, Ruby e PHP usam listas dinâmicas por padrão. Rust oferece ambos: [T; N] para tamanho fixo e Vec<T> para dinâmico. Escolha arrays fixos quando o tamanho é conhecido em tempo de compilação e você quer alocação na stack; use estruturas dinâmicas quando o tamanho varia em tempo de execução ou você precisa de redimensionamento frequente.

  • Slices -- Slices de Go ([]int) são o tipo dinâmico principal e referenciam arrays subjacentes. Rust e Zig usam referências de slice (&[T]) para visualizações sem cópia. Python e C# usam sintaxe de slice (arr[1:3], arr[1..3]) para subarrays. Slices evitam copiar dados — essencial para performance ao passar subintervalos. Prefira linguagens com suporte a slices ao construir parsers, processadores de stream ou APIs que frequentemente passam segmentos de arrays.

  • Map, filter, reduce -- JavaScript, Python, Ruby e Swift fornecem métodos map, filter e reduce built-in. C# usa LINQ (Select, Where, Aggregate). Java usa Streams. Go e C exigem loops manuais. Escolha linguagens com primitivas funcionais de primeira classe ao fazer pipelines de transformação de dados; caso contrário, espere código imperativo mais verboso.

  • Operações de adicionar/remover -- A maioria das linguagens usa push/pop para operações no final (ex: arr.push(4) em JavaScript, vec.push(4) em Rust). Go usa append(arr, 4) e fatiamento para remoção. O ArrayList de Zig requer alocação explícita e try list.append(4). Considere a ergonomia da API: se você precisa de inserções frequentes em posições arbitrárias, o list.insert() de Python ou o arr.unshift de Ruby podem ser mais simples que a realocação manual de C.

  • Estilo funcional vs loops manuais -- Linguagens como JavaScript e Python permitem encadear arr.map(x => x*2).filter(x => x > 0). Go e C forçam loops explícitos. Java Streams fazem a ponte com .map().filter().collect(). Se sua equipe prefere código declarativo, favoreça JavaScript, Python ou Java; para controle máximo e abstração mínima, C ou Go funciona melhor.