Ola pessoal,
Gostaria de saber se tem como “salvar tudo” o que está dentro de um vetor de Strings em uma única String.
[]s
Wagner
Ola pessoal,
Gostaria de saber se tem como “salvar tudo” o que está dentro de um vetor de Strings em uma única String.
[]s
Wagner
e ai vagner se é o que entendi é facil.
StringBuffer unicaString
for(int i = 0; i < vetorString.length; i++)
unicaString.append(vetorString[i]);
blz.
bom cara o que vc pode estar fazendo é um laco, onde em cada interação, vc adiciona a string.
Ex
String strConc = "";
for(int i = 0; i < seuarray.length; i++) {
strConc += array[i];
}
Ai vc tera a string concatenada com todos os dados do array(vetor)
flw…
Use a implementacao do viniciusprd, pois é muito mais eficiente.
Aí está uma complementacao do código:
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < vetorString.length; i++){
buffer.append(vetorString[i]);
}
String stringao = buffer.toString();
po viniciusprd, escrevemos ao mesmo tempo, nem tinha visto hehehehe
Olá PEssoal,
Muito obrigado pela ajuda, funcionou.
[]s
Wagner
[quote=“wagner_duvidas”]Olá PEssoal,
Muito obrigado pela ajuda, funcionou.
[]s
Wagner[/quote]
Só uma dica de performance tuning:
Errado:
for(x = 0; x < vetor.length; x++)
Certo:
int len = vetor.length;
for(x = 0; x < len; x++)
O laço funciona assim:
INICIA; COMPARA; EXECUTA
ou seja, ele checa a cada interação pelo segundo bloco…e toda vez ele vai olhar pro length de novo da variável…isso fica ainda pior em casos como ArrayList.size() …
Se voce declaran o tamanho em um int, ficamuito mais rápido, o int é tipo primitivo e sendo declarado localmente, fica armazenado no heap…voce ganha uma bela diferença entre um código e outro…
Se o objeto for normalmente modificado por uma outra thread por exemplo, há uma grande diferença…ainda mais se o mesmo involver blocos sincronizados…
E o código fica mais bonito e aJVM mais feliz
[quote=“mavi”][quote=“wagner_duvidas”]Olá PEssoal,
Muito obrigado pela ajuda, funcionou.
[]s
Wagner[/quote]
Só uma dica de performance tuning:
Errado:
for(x = 0; x < vetor.length; x++)
Certo:
int len = vetor.length;
for(x = 0; x < len; x++)
O laço funciona assim:
INICIA; COMPARA; EXECUTA
ou seja, ele checa a cada interação pelo segundo bloco…e toda vez ele vai olhar pro length de novo da variável…isso fica ainda pior em casos como ArrayList.size() …
Se voce declaran o tamanho em um int, ficamuito mais rápido, o int é tipo primitivo e sendo declarado localmente, fica armazenado no heap…voce ganha uma bela diferença entre um código e outro…
Se o objeto for normalmente modificado por uma outra thread por exemplo, há uma grande diferença…ainda mais se o mesmo involver blocos sincronizados…
E o código fica mais bonito e aJVM mais feliz :)[/quote]
boa mavi … mandou bem , nunca tinha pensado por esse lado ! heeh
Temos que pensar tb que é mais uma variavel alocada na memoria…
Mas de qualquer jeito e auma alternativa.
Flw…
[quote=“renan_daniel”]Temos que pensar tb que é mais uma variavel alocada na memoria…
Mas de qualquer jeito e auma alternativa.
Flw…[/quote]
Mas é um tipo primitivo e muito mais rapido do que uma chamada de método
Além do que o size() em si retorna um int a cada interação, voce simplesmente não tem a cópia dele, mas ele é criado…
A decisão é entre criar uma vez ou N vezes…
[quote=“mavi”][quote=“renan_daniel”]Temos que pensar tb que é mais uma variavel alocada na memoria…
Mas de qualquer jeito e auma alternativa.
Flw…[/quote]
Mas é um tipo primitivo e muito mais rapido do que uma chamada de método
Além do que o size() em si retorna um int a cada interação, voce simplesmente não tem a cópia dele, mas ele é criado…
A decisão é entre criar uma vez ou N vezes… :)[/quote]
Eu fiquei na dúvida e resolvi testar.
[code]import java.util.Date;
public class Tunning {
public static void main (String args[]) {
//Cria um array com uma sequencia
//de inteiros
long array[] = new long[600000];
for (int i = 0; i < array.length; i++)
array[i]=i;
//Obtem o primeiro tempo
Date s = new Date();
long t1 = s.getTime();
s=null;
//Laços for aninhados para o teste
int num;
int len = array.length;
for (int i = 0; i < 100; i++) {
for(int x = 0; x < len; x++)
num = (int) Math.random() * 1000;
}
//Obtem o segundo tempo
Date m = new Date();
long t2 = m.getTime();
m=null;
//Imprime a diferença
System.out.println(t2 - t1);
}
}
[/code]
Depois de testado desse jeito substitui o int len por array.length, e não deu diferença nenhuma. Foi exatamente o mesmo tempo ( aprox 8350 mS ). Depois testei com o metodo static Array.getLength(array) nesse caso sim deu diferença.
Acredito que isso se deve a array.lenght ser também uma variavel de instancia primitiva da classe array, visto que não é um método como String.length()
Não sei se o código que eu usei no teste é valido, usei o metodo getTime pois foi o unico que achei :sad:
PS. Usei Math.random só por motivos de não ter pensado em outra coisa e também para forçar o laço ‘for’ fazer muitas repetições (60 milhões) de uma instrução simples.
Olá Pessoal,
Mais uma vez obrigado pelas respostas. Muito interessante ter uma explicação do desempenho do algoritmo, além de ter o meu problema resolvido.
[]s
Wagner
[quote=“Fabio_Mendes”][quote=“mavi”][quote=“renan_daniel”]Temos que pensar tb que é mais uma variavel alocada na memoria…
Mas de qualquer jeito e auma alternativa.
Flw…[/quote]
Mas é um tipo primitivo e muito mais rapido do que uma chamada de método
Além do que o size() em si retorna um int a cada interação, voce simplesmente não tem a cópia dele, mas ele é criado…
A decisão é entre criar uma vez ou N vezes… :)[/quote]
Eu fiquei na dúvida e resolvi testar.
[code]import java.util.Date;
public class Tunning {
public static void main (String args[]) {
//Cria um array com uma sequencia
//de inteiros
long array[] = new long[600000];
for (int i = 0; i < array.length; i++)
array[i]=i;
//Obtem o primeiro tempo
Date s = new Date();
long t1 = s.getTime();
s=null;
//Laços for aninhados para o teste
int num;
int len = array.length;
for (int i = 0; i < 100; i++) {
for(int x = 0; x < len; x++)
num = (int) Math.random() * 1000;
}
//Obtem o segundo tempo
Date m = new Date();
long t2 = m.getTime();
m=null;
//Imprime a diferença
System.out.println(t2 - t1);
}
}
[/code]
Depois de testado desse jeito substitui o int len por array.length, e não deu diferença nenhuma. Foi exatamente o mesmo tempo ( aprox 8350 mS ). Depois testei com o metodo static Array.getLength(array) nesse caso sim deu diferença.
Acredito que isso se deve a array.lenght ser também uma variavel de instancia primitiva da classe array, visto que não é um método como String.length()
Não sei se o código que eu usei no teste é valido, usei o metodo getTime pois foi o unico que achei :sad:
PS. Usei Math.random só por motivos de não ter pensado em outra coisa e também para forçar o laço ‘for’ fazer muitas repetições (60 milhões) de uma instrução simples.[/quote]
Sim, o length nada mais é que um int …o bicho só pega quando é de comparação (como ArrayList.size() Vector.size() etc etc )…
E mesmo assim a diferença é muito pequena…
Agora imagina multiplas threads mexendo na mesma estrutura, cada chamada no size() teria uma boa adição na performance.
Em códigos críticos, entra o loop unrolling também, pra um ganho extra de performance…algo como:
len = Math.ceil(vetorString.length / 4);
try {
for(int i = 0; i < len; i += 4) {
unicaString.append(vetorString[i - 3]);
unicaString.append(vetorString[i - 2]);
unicaString.append(vetorString[i - 1]);
unicaString.append(vetorString[i]);
}
} catch(Exception e) {
//
}
O try e catch não adiciona nenhum overhead no código, e do ponto de vista de performance tuning é perfeitamente aceitável o bloco acima.
Eu tinha um livo da o’reilly sobre perf tuning mto bom…
Recomendo!