Eu precisava converter números decimais de uma string para binário. Precisava usar isso em um programa.
Eu tentei este código:
static String numbers = "48, 40, 6, 82, 222, 94, 152, 46, 77";
public static void main(String[] args) {
for (int i = 0; i < 255; i++) {
numbers = numbers.replaceAll(Integer.toString(i), Integer.toBinaryString(i));
}
System.out.println(numbers);
}
O que eu esperava do console:
110000, 101000, 110, 1010010, 11011110, 1011110, 10011000, 101110, 1001101
O que realmente aconteceu:
11011011110010110110111100100110110111100101101101111001000,
110110111100101101101111001000,
11011011110010110111101101111001010,
1101101111001011011011110010001101101111001010,
110110111100101011011011110010101101101111001010,
11011011110010110110111100100110110111100101101111011011110010110110111100100,
1101101111001011011110110111100101011011011110010110111101101111001010,
1101101111001011011011110010011011011110010110111101101111001010,
11011011110010110111110110111100101101111101101111001011
Acho que o conversor ( for
loop) está convertendo números que já foram convertidos (por exemplo 10, 110, 100
)
Dividir string, analisar cada parte
Você está se preparando para o fracasso ao executar um loop sobre um intervalo obscuro de números e fazer substituições de strings estranhas. Em vez disso, eu recomendaria dividir a string e processar
cada número individualmente:
Se você quiser algo mais sofisticado, pode usar uma frase curta:
Ou, se você for como eu e pensar demais em desempenho e otimização, também pode usar um scanner com um delimitador personalizado. Isso pode melhorar a complexidade do tempo de execução, já que o exemplo acima tem uma complexidade de pelo menos
O(2n)
. Vale ressaltar também que a implementação subjacente paraString#split
usa umArrayList
, o que também pode afetar o desempenho:**
String#split
cria uma lista de arrays internamente e, em seguida, chamaList#toArray(String[])
. Dependendo da string e da expressão regular utilizadas, essa lista pode se expandir várias vezes. Não tenho certeza do custo real de desempenho associado à expansão de uma lista de arrays ou à sua conversão para um array, devido ao fato de que ela usa essaSystem.arraycopy
função internamente. Veja esta pergunta relacionada: Por que System.arraycopy é nativo em Java?É uma transformação simples: se você quebrar a string pelo delimitador, convertê-la em um inteiro e mapeá-la para o binário. Um exemplo simples de fluxo mostra estes passos:
Se o seu delimitador não for exatamente ", ", você pode usar uma expressão regular para lidar com espaços em branco.