Metodo trimArray

7 respostas
Mikhas

Hey galera!

Esto fazendo uma aplicação super descolada tals onde leio algums arquivos e gravo no banco de dados. Para mim não ficar lendo do arquivo e gravando no BD com muita grequencia, criei um bufferzinho, sé que estou tendo problemas quando o buffer não é totalmente cheio e para arrumar isso criei um metodo “trimArray”.

public static Object[] trimArray(Object[] array) {
		int c1 = 0;
		while (array[c1] != null)
			c1++;

		Object[] temp = new Object[c1];

		System.arraycopy(array, 0, temp, 0, c1);

		return temp;
	}

aparentemente funciona só que estou tendo problemas no cast do retorno:

lineBuffer = (String[][]) Arrays.trimArray(lineBuffer);

A Exception:
[color=red]java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [[Ljava.lang.String;[/color]

Alguem tem idea do porque do erro?
Talvez usando Generics? Só que não sei aplicar generics em um caso como esse :frowning:

valew galera

7 Respostas

Vini_Fernandes

Entao, primeiramente a classe java.util.Arrays nao possui um metodo trimArrays(), desse modo voce tera um erro em tempo de compilacao nessa linha. Outro erro esta no cast lineBuffer = (String[][]) Arrays.trimArray(lineBuffer); pois aqui voce tem um array bidimensional.

Suponha agora que voce tenha ia lista de Strings List lista; é frequente o erro de cast quando fazemos String [] array = (String [])lista.toArray(); pois lista.toArray() retorna o tipo Object[]. O que voce deve fazer é: String [] array = lista.toArray(String [] s); assim voce nao tera problemas com o cast!

Bom, foi o que compreendi do seu problema!

Abrcao

Mikhas

Essa classe arrays é minha, eu que criei com varios outros metodos para simplificar algumas rotinas frequentes.

Vini Fernandes:
Suponha agora que voce tenha ia lista de Strings List lista; é frequente o erro de cast quando fazemos String [] array = (String [])lista.toArray(); pois lista.toArray() retorna o tipo Object[]. O que voce deve fazer é: String [] array = lista.toArray(String [] s); assim voce nao tera problemas com o cast!

Bom, foi o que compreendi do seu problema!

Abrcao


Eu não queria usar uma List pois a quantidade de dados que vou trabalhar, eu considero meio grande e queria usar arrays que são estruturas mais simples para não ficar tão pesado.

M

Como você próprio disse, seu problema é com o Cast:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [[Ljava.lang.String;

Você não pode realizar um cast de um array de Object com uma dimensão (Object[]) para um array de String com duas dimensões (Strinng[][]). Reveja o que quer fazer com esse array bidimensional.

E quanto a não usar List, creio que seja bobagem quando a performance. Até porque se você evitar alguma implementação de List porque acha que ficará pesado - talvez em relação a memória - pode ter, por exemplo, problemas com processamento ao chamar várias vezes esse seu método trim (sem contar o trabalho que terá implementando novos métodos e classes).

T

Mikhas:

Eu não queria usar uma List pois a quantidade de dados que vou trabalhar, eu considero meio grande e queria usar arrays que são estruturas mais simples para não ficar tão pesado.

Um ArrayList é implementado internamente usando-se um array.

A JVM transforma a chamada aos métodos get e set em um acesso direto a um array, se esse método for chamado suficientes vezes para que o método seja compilado para código nativo. Portanto não há grande vantagem em usar arrays em vez de ArrayList.

Normalmente não compensa ficar tendo o trabalho que você teve (ficar redimensionando arrays no braço) porque isso acaba gastando mais tempo, em vez de economizar alguma coisa.

Uma coisa que aprendi quanto a desempenho é que em 99,9% das vezes é melhor usar estruturas de dados mais adequadas, em vez de usar só arrays e ficar fazendo um monte de gambiarras. Por exemplo, no seu caso nem sei se o melhor é usar um ArrayList. Às vezes é melhor pensar um pouco antes, e ver se o que você precisa não é melhor atendido por um Map ou um Set.

B

Não ficar tão pesado? Já comparou a diferença? É irrisória.

De qualquer forma você pode encapsular uma List dentro de outra classe, instanciá-la para ficar com um tamanho mínimo desejável, e ir colocando as coisas dentro desse buffer. Quando ele ficar cheio, comite os dados, limpe o buffer e comece de novo.

Achei estranho você falar “gravar no BD com frequencia”, por acaso o modo de transação está em autocommit?

T

Eu me lembro que, quando se faz um benchmark adequado, a diferença é próxima a zero. Portanto normalmente é melhor usar um ArrayList em vez de um array normal.

Vini_Fernandes

Ratificando o comentario do thingol , creio que adotar uma alguma implementacao de Collection ou Map nao compromenta a sua performance, pois a maioria dos frameworks de persistencia (veja o Hibernate como exemplo) utiliza uma List para retornar a maior parte de suas consultas! Por esse fato imagino que esse seja um bom caminho, mesmo desconhecendo como sao implementados os algoritmos de busca de List, Set, Map, etc.

Abracao

Criado 2 de fevereiro de 2009
Ultima resposta 3 de fev. de 2009
Respostas 7
Participantes 5