[RESOLVIDO] "Traduzir" Javascript para Java

Pessoal, não tenho muito conhecimento em JS, alguém consegue explicar esse código pra mim? Atualmente tenho mais conhecimento em Java.

const str = '1,2,3,4,5,6';

let index = 0;

const result = str
    .replace(/[,]/g, _ => ++index % 2 === 0 ? '#' : ',')
    .split('#')
    .map(e => e.split(',').map(n => Number(n)));

console.log(result);

Quebrando por partes:

str.replace(/[,]/g, _ => ++index % 2 === 0 ? '#' : ',')

/[,]/g é uma expressão regular (regex) que significa “uma vírgula” (e que poderia ser apenas /,/g) e o replace serve para substituir as ocorrências de vírgula por alguma outra coisa (o g diz para substituir todas as vírgulas - sem ele, somente a primeira seria substituída).

Essa “outra coisa” que substituirá a vírgula é dada pela função _ => ++index % 2 === 0 ? '#' : ',', que basicamente incrementa o valor de index, verifica se é par (e se for, substitui a vírgula por #, senão, substitui por uma vírgula - ou seja, troca uma vírgula sim, outra não). O resultado desse replace é a string 1,2#3,4#5,6.

Depois o split('#') separa a string em partes, usando o # como separador, então teremos um array com 3 strings: [ '1,2', '3,4', '5,6' ].

Por fim, o map aplica uma função a cada um dos elementos deste array. No caso, ele pega cada uma das 3 strings acima, faz outro split (mas agora separando pela vírgula), e transforma cada elemento em número. O resultado é que cada string vira um novo array, contendo os números antes e depois da vírgula: [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ].

Só pra constar, acho esse código desnecessariamente complicado. Dá pra fazer de forma mais simples (e também mais rápida, por não usar regex nem ficar chamando vários callbacks - que são as funções chamadas por replace e map - aliás, segue aqui o teste que fiz, e a solução abaixo é muito mais rápida).

Basicamente, dá pra fazer um único split separando pela vírgula, e aí pega os números de 2 em 2:

const str = '1,2,3,4,5,6';

let partes = str.split(',');
let result = [];
for (var i = 0; i < partes.length; i += 2) {
    result.push([ parseInt(partes[i]), parseInt(partes[i + 1])]);
}
console.log(result);

Em Java basta fazer a mesma lógica (assumindo que a string sempre tem uma quantidade par de números):

String s = "1,2,3,4,5,6";
String[] partes = s.split(",");
int[][] result = new int[partes.length / 2][2];
for (int i = 0; i < partes.length; i += 2) {
    result[i / 2] = new int[] { Integer.parseInt(partes[i]), Integer.parseInt(partes[i + 1]) };
}
System.out.println(Arrays.deepToString(result)); // [[1, 2], [3, 4], [5, 6]]
2 curtidas

muito obrigada, saberia me dizer uma forma mais simples? eu até tentei entender antes de perguntar aqui o código em JS mas esta complicado haha

Na minha mensagem anterior eu coloquei uma alternativa em JS (dê um F5 porque eu editei algumas vezes).

Obrigada