Se quiserem entender bem a vantagem de um Iterator, experimenta percorrer uma árvore da Collections em pré-ordem e depois em pós-ordem sem usar Iterator…
E adicionar um Objeto a coleção durante o for?
Como a gente faz isso com iterator?
[quote=danilocmiranda]E adicionar um Objeto a coleção durante o for?
Como a gente faz isso com iterator?[/quote]
Isso não tem como.
Então qual a melhor forma de percorrer uma List e adicionar um objeto a ele?
Só criando uma nova List com os novos objetos?
Não entendi. Pra que você precisa percorrer o ArrayList? Não basta só dar add?
Se você não puder inserir duplicados, então é melhor usar um Set. O set também cobre o caso para a ordenação.
Se você precisar inserir um objeto numa ordem específica, faça a busca com o Collections.binarySearch e em seguida use o método insert que aceita como parãmetro um índice, além do valor.
Eu tenho uma lista que é alimentada pelos objetos comuns de outras Listas (podem ser de duas a quatro listas)
Hoje o que faço é percorrer a List com o resultados dos objetos comuns das outras listas e dentro um for aninhado que percorre as outras listas e incrementa na lista Resultado.
Então dentro destes for’s vou incrementando numa Lista Auxiliar e fora do for eu “seto” esta lista auxiliar na lista resultado.
Mais ou menos assim
private List<ListFiltroVO> popularFiltros(List<ProdutoVO> listProd) {
Integer contador = 0;
ListFiltroVO tipoFiltroComFiltros = new ListFiltroVO();
List<ListFiltroVO> listaFiltroVoAuxiliar = new ArrayList<ListFiltroVO>();
if (listProd != null) {
listFiltrosView = new ArrayList<ListFiltroVO>();
for (ProdutoVO produto : listProd) {
for (FiltroVO pv : produto.getFiltros()) {
if (listFiltrosView.size() == 0) {
tipoFiltroComFiltros.setDescricao(pv.getTipoFiltro()
.getNomeTipoFiltro());
tipoFiltroComFiltros.setListItens(getListFiltros());
List<FiltroVO> listAux = new ArrayList<FiltroVO>();
tipoFiltroComFiltros.setListItens(listAux);
tipoFiltroComFiltros
.setListaFiltros(listaFiltroVoAuxiliar);
tipoFiltroComFiltros.getListItens().add(pv);
tipoFiltroComFiltros.setContador(contador);
listFiltrosView.add(tipoFiltroComFiltros);
listaFiltroVoAuxiliar = listFiltrosView;
} else {
tipoFiltroComFiltros = new ListFiltroVO();
tipoFiltroComFiltros.setDescricao(pv.getTipoFiltro()
.getNomeTipoFiltro());
if (!listaFiltroVoAuxiliar
.contains(tipoFiltroComFiltros)) {
List<FiltroVO> listAux = new ArrayList<FiltroVO>();
tipoFiltroComFiltros.setListItens(listAux);
tipoFiltroComFiltros.getListItens().add(pv);
listFiltrosView.add(tipoFiltroComFiltros);
} else {
System.out.println("Este filtro ja existia");
}
if (!listFiltrosView.contains(tipoFiltroComFiltros)) {
listFiltrosView.add(tipoFiltroComFiltros);
}
}
}
}
return listFiltrosView;
}
return listFiltrosView;
}
Está funcionando, mas estou achando complicado demais…
alguma dica para simplificar este código?
P.s.: Perdão se cometi algum pecado no código, estou me expondo para aprender.
O resultado final é o que tiver de comum em todas as listas, é isso?
Isso, o resultado é tudo que tem de comum entre as listas.
E ainda tenho que contar quantas vezes cada objeto apareceu nas listas.
Eu contaria através de um map<objeto, integer>().
Entendi, vou fazer isso, acho que colocando dentro do meu código vai ser bem simples.
Valeu pela dica Vini.
O que achou do código? Dá pra melhorar?
Aparentemente sim. Mas sem conhecer mais a fundo as classes e as regras de negócio, fica difícil afirmar com certeza.
Quanto a usar o HashMap para contar tenho uma dúvida.
Utilizo JSF 2 e não consigo exibir um HashMap diretamente do JSF (parece e a versão 2.1 vai fazer isso…)
Como posso depois desmembrar o HashMap em duas List ( List e List ) e depois exibir na tela em sincronia?
Use os métodos entrySet() e values() do HashMap.
Boa tarde,
estou fazendo a leitura de informações de uma planilha Excel através do apache poi
na minha planilha, tenho 28 colunas, porém quando vou acessar a 26ª coluna aparece o seguinte erro:
ArrayIndexOfBoundsException: 28
Se eu manipular a planilha, excluindo as ultimas 3 colunas, sendo a planilha com 25 colunas o erro não acontece.
Alguém pode por favor me ajudar com esta questão? Obrigado!
segue minha Classe de leitura de arquivo excel:
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import com.hsbc.stivscvm.bean.STI_VO;
public class LeitorExcel {
public LeitorExcel()
{
}
@SuppressWarnings({ "deprecation", "unused" })
public static List<STI_VO> readExcelMovimentacao(String data) throws IOException, IllegalArgumentException, IntrospectionException, IllegalAccessException, InvocationTargetException {
List<STI_VO>listaSTI = new ArrayList<STI_VO>();
HSSFWorkbook wb = null;
HSSFRow row = null;
HSSFCell cell = null;
SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
File file = new File((new StringBuilder("H:\\Transfer\\Teste\\LeituraExcel\\Excel\\")).append(data).toString());
File afile[] = file.listFiles();
int i = 0;
int count = 0;
STI_VO sti = null;
for (int j=0; i < afile.length; i++) {
File arquivos = afile[i];
InputStream inp = new FileInputStream(arquivos.getPath());
wb = new HSSFWorkbook(inp);
HSSFSheet sheet = wb.getSheetAt(0);
int countline = 0;
for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext();) {
row = (HSSFRow) rit.next();
countline++;
if (countline > 2) {
sti = new STI_VO();
for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext();) {
cell = (HSSFCell) cit.next();
if (cell.getCellType() != HSSFCell.CELL_TYPE_BLANK) {
CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());
String valor = null;
if(cell==null){
System.out.println("Cell in Row number "+(cell.getRowIndex()+1)+" is null.");
}else{
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING: // '\001'
System.out.println(cell.getStringCellValue());
valor = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC: // '\0'
valor = "" + cell.getNumericCellValue();
System.out.println(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_BLANK:
System.out.println("Celula em Branco");
continue;
default:
}
}
sti = addCellSti(cell.getCellNum(), valor.trim(), (new STI_VO()).getClass(), sti);
}
}
sti.setDtCota(sti.getDtCota().replace("00:00:00", ""));
sti.setDtCota(sti.getDtCota().trim());
if(!sti.getValorPL().contains("cota"))
{
System.out.println(sti.getValorPL());
listaSTI.add(sti);
count++;
System.out.println("linha: "+count);
mapSTI_VO.put(sti.getValorPL(), sti);
}
}
}
listaSTI.add(sti);
}
System.out.println("--- FIM DE ARQUIVO ---");
return listaSTI;
}
public static STI_VO addCellSti(int i, String valor, Class<?> cotas, STI_VO instancia)
throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
Field[] campos = cotas.getDeclaredFields();
PropertyDescriptor descriptor = new PropertyDescriptor( campos[i].getName(), cotas);
if(i == 5 && valor.startsWith("0"))
valor = valor.substring(1, valor.length());
Method method = descriptor.getWriteMethod();
method.invoke(instancia, new Object[] {
valor.trim()
});
return instancia;
}
public static HashMap<String, STI_VO> mapSTI_VO = new HashMap<String, STI_VO>();
}