Estou desenvolvendo um sistema de controle de estatísticas em planilhas XLS e ultimamente tenho trabalhado com a API POI para manipulação das mesmas. Só que minhas classes para armazenamento de informações nestas planilhas estão imensas, tornando algo extenso, complexo e demorado.
Por motivos de performance de sistema, gostaria de saber se tem alguma forma de instanciar objetos dentro de um laço de repetição como o FOR. Caso não dê para usar este método, gostaria que me indicassem formas aleatórias de solucionar este meu problema.
public void go() {
MyClass my = null;
for (...) {
my = new MyClass();
my.setId(1);
my.setOutro("pol");
}
}
Seria isso?
fernandosavio
Conterrâneo romarcio!
Vejo que sua experiência com o Java vai muito além da minha, mas aí vai a dúvida…
Se ele fizer como você disse ele não vai perder o valor do último MyClass a cada loop?
Posso estar equivocado mas eu guardaria os dados em um List ou alguma outra Collection(A não ser que ele ocupasse o objeto e descartasse mesmo)…
DanTecvip
É mais ou menos isso romarcio
É que na verdade eu criaria o nome do objeto instanciado com base em dois FOR por exemplo:
for(int lin = 1;lin <= 10;lin++)
for(int col = 1;col <= 10;col++){
ClasseObjeto celula+""+col+"_"+lin = new ClasseObjeto();
}
Desse modo, ele instanciaria objetos celula1_1, celula1_2, celula1_3…celulaN_N
romarcio
fernandosavio:
Conterrâneo romarcio!
Vejo que sua experiência com o Java vai muito além da minha, mas aí vai a dúvida…
Se ele fizer como você disse ele não vai perder o valor do último MyClass a cada loop?
Posso estar equivocado mas eu guardaria os dados em um List ou alguma outra Collection(A não ser que ele ocupasse o objeto e descartasse mesmo)…
Você esta certo. Poderia ser criada uma lista para guarda cada objeto criado dentro do for.
Eu só fiz o exemplo de como criar a instancia dentro do for, o que ele vai fazer com cada uma delas, dai é com ele.
DanTecvip
Se ele cria os objetos dentro de um for acredito que seria um problema depois para manipulá-las. Só se utilizasse a orientação do nosso amigo fernandosavio em armazenar eles dentro de um Collection ou List. Mas como seria a implementação de List ou Collection neste contexto.
romarcio
Isso que você quer fazer de concatenar para criar o nome da variável não é possível. O compilador não vai aceitar.
Criar um lista para guarda cada objeto criado seria uma solução sim.
public void go() {
List<MyClass> list = new ArrayList<MyClass>();
MyClass my = null;
for (...) {
my = new MyClass();
my.setId(1);
my.setOutro("pol");
list.add(my);
}
}
DanTecvip
Mas romarcio como eu iria utilizar estes objetos da List depois por exemplo para setar um valor em uma célula de uma planilha XLS
Veja como estou fazendo.
packagetestes;importjava.io.FileInputStream;importjava.io.FileOutputStream;importorg.apache.poi.hssf.usermodel.*;publicclassGerarXLS{publicstaticvoidmain(String[]args)throwsException{FileInputStreaminp=null;FileOutputStreamfileOut=null;HSSFWorkbookworkbook;HSSFSheetsheet;Stringfile="arquivos/Template.xls";try{//Chamando o arquivo xls de modeloinp=newFileInputStream(file);//Inicializando a planilhaworkbook=newHSSFWorkbook(inp);//Selecionando a aba que irá manipular arquivossheet=workbook.getSheetAt(0);//Pega os dados de uma determinada linha para manipulação, iniciando em 0.HSSFRowrow4=sheet.getRow(3);//Pega os dados de uma determinada linha, sendo que a primeiro célula de uma linha é 0. HSSFCellcel4_1=row4.getCell(1);HSSFCellcel4_2=row4.getCell(2);HSSFCellcel4_3=row4.getCell(3);HSSFCellcel4_4=row4.getCell(4);HSSFCellcel4_5=row4.getCell(5);HSSFCellcel4_6=row4.getCell(6);//Inserindo dados nas células de uma determinada linhacel4_1.setCellValue(2);cel4_2.setCellValue(4);cel4_3.setCellValue(1);cel4_4.setCellValue(3);cel4_5.setCellValue(6);cel4_6.setCellValue(2);//Gerando um novo arquivo xls com as alteraçõesfileOut=newFileOutputStream("arquivos/alterado.xls");// Gerando o arquivo de saídaworkbook.write(fileOut);}catch(Exceptione){e.printStackTrace();}finally{inp.close();fileOut.close();}}}
Como pode ver a criação de células é algo redundante. Sem contar que neste código apenas consta 6 células, imagine uma planilha XLS com uma estrutura de 600 células, 50 linhas e 30 colunas todas sendo instanciadas nesta classe :?
Isso seria um trabalho e tanto para fazer. Sem contar o desempenho que possivelmente seria afetado
Espero que possa ser solucionado este problema. Mas voltando ao List como seria feito a manipulação de um objeto dentro de uma List?
Por enquanto vou ver se dá para continuar nesta API usando List. Qualquer coisa, eu irei pesquisar por outras APIs mesmo.
Mas agradeço pelo apoio ae vlw
Abraços, Danilo.
JhowTroMundo
Se entendi bem, você poderia usar uma matriz. (lista de listas)
publicstaticvoidmain(String[]args){inttamLinha=10;intqtdLinhas=10;List<List><String>>linhas=newArrayList<List><String>>();List<String>linha;for(intlin=0;lin<qtdLinhas;lin++){//popula uma linhalinha=newArrayList<String>();for(intcol=0;col<tamLinha;col++){linha.add(newString(lin+", "+col));}linhas.add(linha);}//Dessa forma pode-se referenciar cada celula pela coordenada da matrix (Y, X)//Imprime linha 6, coluna 3System.out.println(linhas.get(5).get(2));//imprimir todos os elementos for(List<String>lin:linhas){for(Stringstring:lin){System.out.print(string+" | ");}System.out.println();}}