Algoritmo chato

Galera prazer…

Direto ao ponto !

Tenho um algoritmo simples demais até, só que não sei como proceder, talvez por não ter muita experiência na prática no momento

Tenho que ler um diretório – moleza

Guardar o nome de cada arquivo em um vetor – moleza

Pegar um pedaço específico do nome – moleza.

Saber quantas Empresas se repetem como mostra o exemplo abaixo

O nome do arquivo:

xxxxxxxxxxxxxxxxxxxxxxx488201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx488201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx488201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx488201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx488201xxxxxxxxxxxxxxxxxxx.pdf

xxxxxxxxxxxxxxxxxxxxxxx455201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx455201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx455201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx455201xxxxxxxxxxxxxxxxxxx.pdf
xxxxxxxxxxxxxxxxxxxxxxx455201xxxxxxxxxxxxxxxxxxx.pdf

Ai neste caso são 10 arquivos mas somente 2 Empresas.

Parte que eu recupero : 488201

Objetivo, no meio de 3000 arquivos tenho que verificar quantas empresas existem

Esse foi o algoritmo que eu criei para tal, ele até recupera só que eu fiz um teste com 166 arquivos deveria retornar 31 Empresas , só que retorna somente 21.

Os Srs muito mais experiêntes poderiam me dar uma luz ???



import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;


public class RecuperaArquivos
{
	public static void main(String[] args)
	{
	
	
							
			String dir = "C:/pdfTeste/";

			File diretorio = new File(dir);
			
			File fList[] = diretorio.listFiles();

			System.out.println("Numero de arquivos no diretorio : " + fList.length );

			int total = 0;
			int totalEmp = 0;
		
			
			for ( int i = 0; i < fList.length; i++ ){
				
				String nArqComp = fList[i].getName();
				String nArquivo = fList[i].getName().substring(21, 26);
			  
			
				 if(nArqComp.regionMatches(21, nArquivo, 26, 57)){
					 
					 totalEmp ++;
					 
				 }
				 
				 
			}
				 
			
			

			System.out.println("Total de empresas: " + totalEmp);
		
					
	
} 

[]'s

E muito obrigado.

Usa um Set e adiciona todas empresas para lá e depois no final vê o tamanho. Ele se encarrega de descartar as repetidas.

Fala meu caro,

Entendi, só que o objetivo é justamente pegar o total de repetidos, pq depois vou ter que fazer um laço para dar um merge nos PDF’s destas empresas.

Obrigado pela resposta !

Então, se eu entendi e so usar o add do set, ai vc olha o retorno se retornar false é pq ele ja existe no set, logo é repetido. flw

Boa , vou tentar.

Obrigado !

usa um hash :wink:

usa o codigo da empresa como chave.

logo pra cada chave vc vai ter a quantidade de repetições :wink:

hehe

Ganhou o Hash.

Assim que finalizar coloco a solução completa Srs.

Mais uma vez muito obrigado e bom fds!

	public static void main(String[] args) {  
		File directory = new File("/pdfTeste");  
		List&lt;File&gt; files = Arrays.asList(directory.listFiles());
		System.out.println("Numero de arquivos no diretorio : " + files.size());  
		
		List&lt;String&gt; companys = new ArrayList&lt;String&gt;();
		
		for (File file : files){  
			String name = file.getName();  
			String firstName = name.substring(21, 26);  
			if(name.regionMatches(21, firstName, 26, 57)){  
				companys.add(name); 
			}  
		}  
		System.out.println("Total de empresas: " + companys.size());  
	}   

Cara muito obrigado pelo algoritmo!

Funciona perfeitamente.

Só que na Sexta mesmo eu já havia conseguido resolver satisfatoriamente.

Segue para estudo posterior de vocês, se servir …


package br.com.goldencross.mergePdf;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

public class MesclaPDF
{
	public static void main(String[] args)
	{
		
				

			String dir = "C:/pdfTeste/";

			File diretorio = new File(dir);
			
			File fList[] = diretorio.listFiles();

			int total = 0;
			int totalEmp = 0;
						
			//1º laço - recupera os arquivos do diretório, representa o total de arquivos.
			
			Map<String, String> list1 = new HashMap<String, String>();		
			
			// 1 lista
			for ( int i = 0; i < fList.length; i++ ){
				//Acrescenta as empresas em uma HashTable com índice 
				list1.put(fList[i].getName().substring(21, 26),fList[i].getName());         
			}
					
			 
		    //Separa por empresa	
			List empresa = new ArrayList(list1.keySet()); 
			int empProc = 0; 
			
			/*Para o total de arquivos no diretório localiza cada ocorrência que seja igual ao keySet do                           Hash map, fazendo assim o processamento.
			*/dos arquivos por empresa não importando a quantidade de pdfs que existam no diretório.
			
		
	        for(int d = 0; d < fList.length ; d++){
	        	
	       //Processa empresas
	        	for(int e = 0; e < empresa.size(); e++){
	        		
	        		if(fList[d].getName().substring(21, 26).equals(empresa.get(e))){
	        		
	        			System.out.println("Posicao"+d+" Empresa:("+ e + ")" + fList[d].getName().substring(21, 26)); 
	 	        		empProc++;	
	        			
	        		}
	        		
	        	}
	  
	        }
	        
	        
	        System.out.println("Tamanho total da lista " + fList.length);
	        System.out.println("Total de empresas encontradas " + empresa.size());
       }
}

Obrigado a todos!

Estás a usar HashMap mas só precisas depois do Set das Keys. Devias ter usado logo o Set como eu disse acima :slight_smile:

Lição aprendida.

Abs

Aproveitando…

Como eu colocaria este trecho do algoritmo em um laço ?

	PdfReader reader1 = new PdfReader("C:/pdfTeste/01.pdf");
			PdfReader reader2 = new PdfReader("C:/pdfTeste/02.pdf");
			PdfReader reader3 = new PdfReader("C:/pdfTeste/03.pdf");
			PdfReader reader4 = new PdfReader("C:/pdfTeste/01.pdf");
			PdfReader reader5 = new PdfReader("C:/pdfTeste/02.pdf");
			PdfReader reader6 = new PdfReader("C:/pdfTeste/03.pdf");						
			
			PdfCopyFields copy;
			
			copy = new PdfCopyFields(new FileOutputStream("C:/pdfTeste/concatenado/docConcatenado.pdf"));

			copy.addDocument(reader1);
			copy.addDocument(reader2);
			copy.addDocument(reader3);
			copy.addDocument(reader4);
			copy.addDocument(reader5);
			copy.addDocument(reader6);
			copy.close();

Mais uma vez muito obrigado.