bom pessoal resolvi após meses de estudo de java na FJ-11 decidi fazer meu primeiro programa realmente funcional.
estou catando emails de empresas de desenvolvimento na net pra enviar meu currículo e salvo num arquivo txt onde antes de enviar verifico num outro arquivo txt de emails anteiormente enviados pra ver se tem algum repetido, processo manual e cansativo , razao pela qual quis criar esse programinha.
quero que o progr delete o email repetido do arquivo emails_novos.txt
coloquei os dois txt la na pasta do progr ok
mas fiz algo errado pois num teste coloquei um email repetido e ele nao acusou
alem disso nao soube fazer a implementação pra deletar
ajuda ai people!!!
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestaOperacao {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStream is = new FileInputStream("emails_novos.txt"); //indica o arquivo - lê bytes
InputStreamReader isr = new InputStreamReader(is); //decodifica para Unicode devolve em char
BufferedReader br = new BufferedReader(isr); // lê char, concatena e devolve string
InputStream is2 = new FileInputStream("emails_enviados.txt"); //indica o arquivo - lê bytes
InputStreamReader isr2 = new InputStreamReader(is2); //decodifica para Unicode devolve em char
BufferedReader br2 = new BufferedReader(isr2); // lê char, concatena e devolve string
String email_novo = br.readLine();
while (email_novo != null) {
String email_antigo = br2.readLine();
while (email_antigo != null){
if (email_novo == email_antigo){
System.out.println("email repetido");
// implementação para deletar email_novo do arquivo emails_novos.txt
}
email_antigo = br2.readLine();
}
email_novo = br.readLine();
}
}
}
Cara não seu se existe algo especifico para apagar toda a linha do arquivo de texto.
Mas você pode fazer isso de outra forma. Por exemplo, você pode guardar os não repetidos em um StringeBuilder e ao final de tudo gravar esta StringBuilder no arquivo.
Mais procura no google se existe algo para remover uma unica linha, se existir vc vai encontrar.
flw…
if (email_novo == email_antigo){
Comparação de strings deve ser feita com o método “equals” ou “equalsIgnoreCase”.
pessoal, com relação a comparação entre as strings dos dois arquivos ao invés de usar “equals” nao seria melhor usar o Comparable ja que cada tipo String implementa esse metodo?
Obrigado aos dois amigos dos dois posts acima pela colaboração, estou tentando implementar o que vcs falaram nesse exato momento!
[quote=rafaelczy]pessoal, com relação a comparação entre as strings dos dois arquivos ao invés de usar “equals” nao seria melhor usar o Comparable ja que cada tipo String implementa esse metodo?
Obrigado aos dois amigos dos dois posts acima pela colaboração, estou tentando implementar o que vcs falaram nesse exato momento![/quote]
Se s e t forem 2 strings, s.compareTo (t) == 0 é a mesma coisa que s.equals (t), só que mais lento. Por que é que você quer complicar as coisas?
Comparable é util ser implementado no caso onde vc ira fazer uso de ordenação.
Se eu estiver errado alguem por favor me corrija…
Dê uma olhadinha neste programa. Ele deve fazer o que você precisa.
import java.util.*;
import java.io.*;
class DiferencaArquivos {
private Set<String> lerArquivo (final String nomeArquivoEntrada) throws IOException {
Set<String> emails = new TreeSet<String>(new Comparator<String>() {
public int compare (String s1, String s2) {
return s1.compareToIgnoreCase (s2);
}
});
BufferedReader br = new BufferedReader (new FileReader (nomeArquivoEntrada));
for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
String email = linha.trim();
if (email.length() > 0) {
emails.add (email.trim());
}
}
br.close();
return emails;
}
private void gravarArquivo (final String nomeArquivoSaida, Set<String> emails) throws IOException {
PrintWriter pw = new PrintWriter (nomeArquivoSaida);
for (String email : emails) {
pw.println (email);
}
pw.close();
}
public static void main (String[] args) throws Exception {
DiferencaArquivos da = new DiferencaArquivos();
Set<String> emailsEnviados = da.lerArquivo (args[0]);
Set<String> emailsAEnviar = da.lerArquivo (args[1]);
Set<String> resultado = new TreeSet<String>();
// Queremos remover, de emailsAEnviar, todos os emails que estão em emailsEnviados
resultado.addAll (emailsAEnviar);
resultado.removeAll (emailsEnviados);
da.gravarArquivo (args[2], resultado);
}
}
certo Lucas.
Agora sera que voce me ajuda no seguinte:
public class TestaOperacao {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStream is = new FileInputStream("emails_novos.txt"); //indica o arquivo - lê bytes
InputStreamReader isr = new InputStreamReader(is); //decodifica para Unicode devolve em char
BufferedReader br = new BufferedReader(isr); // lê char, concatena e devolve string
InputStream is2 = new FileInputStream("emails_enviados.txt"); //indica o arquivo - lê bytes
InputStreamReader isr2 = new InputStreamReader(is2); //decodifica para Unicode devolve em char
BufferedReader br2 = new BufferedReader(isr2); // lê char, concatena e devolve string
String email_novo = br.readLine();
while (email_novo != null) {
String email_antigo = br2.readLine();
while (email_antigo != null){
if (email_novo.equals(email_antigo)){
System.out.println("email repetido encontrado");
// mas como implemento aqui para numa bufferedbuilder ?
}
email_antigo = br2.readLine();
}
email_novo = br.readLine();
}
}
}
bom, vamos por partes que esse me pareceu meio complicadinho…rsss…
me corrija se eu estiver errado
import java.util.*;
import java.io.*;
class DiferencaArquivos {
private Set<String> lerArquivo (final String nomeArquivoEntrada) throws IOException { //aqui um metodo tipo Set de Strings mas o parametro ñ entendi
Set<String> emails = new TreeSet<String>(new Comparator<String>() { // aqui um conjunto q recebe como parametro um objeto que compara strings?
public int compare (String s1, String s2) {
return s1.compareToIgnoreCase (s2);
}
});
}
}
esse Comparator(){} eu acho onde na API java ?
[quote=entanglement]Dê uma olhadinha neste programa. Ele deve fazer o que você precisa.
[code]
import java.util.;
import java.io.;
class DiferencaArquivos {
private Set lerArquivo (final String nomeArquivoEntrada) throws IOException { // nao entendi pq esse parametro
Set emails = new TreeSet(new Comparator() {
public int compare (String s1, String s2) {
return s1.compareToIgnoreCase (s2);
}
});
[/code][/quote]
pessoal alguem entendeu a logica do codigo do nosso amigo entanglement ?
eu colei ai em cima apenas o primeiro metodo pois antes de passar para os outros quero entender este.
lembrando que esse codigo é uma sugesta do colega pro meu problema e criar um programa que compara duas lista txt de emails e descarta os repetido numa das listas.
pelo que vi esse metodo DiferencaArquivos teria a função de ler um arquivo txt de emails sendo que ele armazena numa collection apenas os nao repetidos. é isso? to certo?
se sim, minha pergunta é: por que comparar strings se o objetivo é apenas ler pois a comparaçãos sera feita com outro arquivo?
A idéia é a seguinte. Escrevi dois métodos - um que lê um arquivo e armazena os emails em um Set (conjunto de strings). Outro que grava uma coleção de strings em um outro arquivo.
E no meio, uso o método “removeAll” que remove os elementos de um conjunto que já estão presentes no outro. Ou seja, ele elimina os emails que você já mandou. Certo?
O “Comparator” é só uma sofisticação que usei para ordenar o conjunto de strings ignorando a diferença entre maiúsculas e minúsculas. Mas isso poderia ser simplificado se você simplesmente inserisse os emails e usasse um “toLowerCase()” para passá-los todos para minúsculas.
Você já ouviu falar de teoria de conjuntos?
Das operações de união, intersecção e diferença de conjuntos?
No meu tempo (há quase 40 anos atrás) isso se ensinava bem cedo, um pouco depois da tabuada (que ouvi falar que não se ensina mais).
Não sei se ainda ensinam teoria dos conjuntos.
Então… - eu uso a diferença de conjuntos para resolver seu problema.
Amigão entanglement, com relação a operação com conjuntos (a diferença deles) tdo bem… apesar de fazer 30/35 anos tb aprendi isso na velha, boa e não mais existente escola publica, me lembro bem. Me expressei mal com relação a não ter entendido tua lógica.
Na verdade o que eu nao entendi foi apenas o teu metodo lerArquivo()
Caso o autor do código abaixo ñ esteja conectado agora aceito ajuda de todos ai amigos do guj !!! :lol:
Bom formulando a pergunta… colocarei em coment, pra ficar mais setorizado
import java.util.*;
import java.io.*;
class DiferencaArquivos {
//abaixo: ñ entendi o parametro "final String" ! E por que tens q indicar nomeArquivoEntrada se aqui será um conjunto e quem le e precisa da referencia do nome do orquivo de onde sera lido é o BufferedReader?
private Set<String> lerArquivo (final String nomeArquivoEntrada) throws IOException {
Set<String> emails = new TreeSet<String>(new Comparator<String>() { // aqui um conjunto...ok,
public int compare (String s1, String s2) { // ñ entendi essa comparação -ñ é lida uma string p/vez do arq. origem?
return s1.compareToIgnoreCase (s2);
}
});
BufferedReader br = new BufferedReader (new FileReader (nomeArquivoEntrada)); // ok..o BufferedReader localiza o arq p/ ler
for (String linha = br.readLine(); linha != null; linha = br.readLine()) { //aqui ok tb.. um FOR pra ler todas linhas
String email = linha.trim(); // tranquilo... tirou espaços em bco a esq e a dir antes de guardar na variavel
if (email.length() > 0) { // ok... um testezinho pra não gravar string em bco
emails.add (email.trim());
} //acima: ... já nao tirou os espaços 2 linhas acima desta? pensei q devia passar só "emails.add (email);"
}
br.close();
return emails;
}
private void gravarArquivo (final String nomeArquivoSaida, Set<String> emails) throws IOException {
PrintWriter pw = new PrintWriter (nomeArquivoSaida);
for (String email : emails) {
pw.println (email);
}
pw.close();
}
public static void main (String[] args) throws Exception {
DiferencaArquivos da = new DiferencaArquivos();
Set<String> emailsEnviados = da.lerArquivo (args[0]); // tem alguma validade esse parametro??
Set<String> emailsAEnviar = da.lerArquivo (args[1]); // idem aqui
Set<String> resultado = new TreeSet<String>();
// Queremos remover, de emailsAEnviar, todos os emails que estão em emailsEnviados
resultado.addAll (emailsAEnviar);
resultado.removeAll (emailsEnviados);
da.gravarArquivo (args[2], resultado); // achei que o parametro aqui devia ser apenas "resultado"
}
}
Aprendi pacas com o codigo do amigo entanglement mas me atrazei terrivelmente no estudos da FJ-11…nao podia perder mais de 24hs nessa brincadeira mas faze o que ne!!! :thumbup: