Qual é a vantagem do Iterator?

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…

1 curtida

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.

1 curtida

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.

1 curtida

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

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

1 curtida

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.

1 curtida

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

}