Vetor de Strings para uma Única String

12 respostas
W

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

12 Respostas

V

e ai vagner se é o que entendi é facil.

StringBuffer unicaString for(int i = 0; i < vetorString.length; i++) unicaString.append(vetorString[i]);

blz.

R

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…

V

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();
R

po viniciusprd, escrevemos ao mesmo tempo, nem tinha visto hehehehe

W

Olá PEssoal,

Muito obrigado pela ajuda, funcionou.

[]s

Wagner

M

“wagner_duvidas”:
Olá PEssoal,

Muito obrigado pela ajuda, funcionou.

[]s

Wagner

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 :slight_smile:

B

“mavi”:
“wagner_duvidas”:
Olá PEssoal,

Muito obrigado pela ajuda, funcionou.

[]s

Wagner

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 :)

boa mavi … mandou bem , nunca tinha pensado por esse lado ! heeh

R

Temos que pensar tb que é mais uma variavel alocada na memoria…

Mas de qualquer jeito e auma alternativa.

Flw…

M

“renan_daniel”:
Temos que pensar tb que é mais uma variavel alocada na memoria…

Mas de qualquer jeito e auma alternativa.

Flw…

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… :slight_smile:

F
"mavi":
"renan_daniel":
Temos que pensar tb que é mais uma variavel alocada na memoria...

Mas de qualquer jeito e auma alternativa.

Flw...

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... :)

Eu fiquei na dúvida e resolvi testar.

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);
    }
}

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.

W

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

M
"Fabio_Mendes":
"mavi":
"renan_daniel":
Temos que pensar tb que é mais uma variavel alocada na memoria...

Mas de qualquer jeito e auma alternativa.

Flw...

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... :)

Eu fiquei na dúvida e resolvi testar.

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);
    }
}

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.

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!

Criado 17 de setembro de 2004
Ultima resposta 18 de set. de 2004
Respostas 12
Participantes 7