Saltar al contenido principal

Arrays

Los arrays y listas son estructuras de datos fundamentales. Así es como diferentes lenguajes manejan la creación, manipulación e iteración de arrays.

Creación e Inicialización 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

Manipulación 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);

Puntos Clave​

  • Fijos vs dinámicos -- C, Zig y Go usan arrays de tamaño fijo (e.g., int arr[3] en C, var arr = [_]i32{1,2,3} en Zig). JavaScript, Python, Ruby y PHP usan listas dinámicas por defecto. Rust ofrece ambos: [T; N] para tamaño fijo y Vec<T> para dinámico. Elige arrays fijos cuando el tamaño se conoce en tiempo de compilación y quieres asignación en el stack; usa estructuras dinámicas cuando el tamaño varía en tiempo de ejecución o necesitas redimensionar frecuentemente.

  • Slices -- Los slices de Go ([]int) son el tipo dinámico principal y referencian arrays subyacentes. Rust y Zig usan referencias a slices (&[T]) para vistas sin copia. Python y C# usan sintaxis de slice (arr[1:3], arr[1..3]) para subarrays. Los slices evitan copiar datos—esencial para el rendimiento al pasar subrangos. Prefiere lenguajes con soporte de slices al construir parsers, procesadores de streams o APIs que frecuentemente pasan segmentos de arrays.

  • Map, filter, reduce -- JavaScript, Python, Ruby y Swift proporcionan métodos map, filter y reduce incorporados. C# usa LINQ (Select, Where, Aggregate). Java usa Streams. Go y C requieren bucles manuales. Elige lenguajes con primitivas funcionales de primera clase cuando hagas pipelines de transformación de datos; de lo contrario, espera código imperativo más verboso.

  • Operaciones de agregar/eliminar -- La mayoría de lenguajes usan push/pop para operaciones al final (e.g., arr.push(4) en JavaScript, vec.push(4) en Rust). Go usa append(arr, 4) y slicing para eliminación. El ArrayList de Zig requiere asignación explícita y try list.append(4). Considera la ergonomía de la API: si necesitas inserciones frecuentes en posiciones arbitrarias, el list.insert() de Python o el arr.unshift de Ruby pueden ser más simples que la reasignación manual de C.

  • Estilo funcional vs bucles manuales -- Lenguajes como JavaScript y Python te permiten encadenar arr.map(x => x*2).filter(x => x > 0). Go y C fuerzan bucles explícitos. Los Streams de Java hacen de puente con .map().filter().collect(). Si tu equipo prefiere código declarativo, favorece JavaScript, Python o Java; para máximo control y mínima abstracción, C o Go funciona mejor.