Programma che cerca una parola in un file in java

Ciao a tutti come da oggetto ho fatto un programma che dovrebbe cercare una parola in un file ecco il sorgente che è errato, so che devo inizializzare una matrice:

[code]import java.io.*;
public class TrovaParola {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub
	int ]] parole;
	String file = args[0];
	File inFile = new File(file);
	BufferedReader reader = null;
	FileInputStream input = null;
	InputStreamReader oddio;
	String parola="";
	if(args.length<2)
		System.out.println("Inserire il nome del file e almeno una parola da cercare");
	if(!inFile.exists())
		System.out.println("Il file non esiste!");
	for(int i = 1; i<args.length; i++){
		input = new FileInputStream(inFile);
		oddio = new InputStreamReader(input);
		reader = new BufferedReader(oddio);
		while(parola!=null && parola == args*){
		parola = reader.readLine();
		System.out.println("La parola è stata trovata: " + parola);
		}
		
		
	}
}

}[/code]

Alla matrice penso dopo ora vorrei che stampasse il contenuto dell’array args in posizione 1 se è uguale al contenuto della variabile parola, ma non va, non stampa nulla, le parole da cercare le do in input da linea di comando. suggerimenti?*

parola è sempre la stringa nulla, esce dal while e si fa il loop a vuoto.

si ma non riesco a trovare una soluzione, bhe in questi casi penso sia meglio staccare un attimo e rivedere dopo

Ad occhio, per verifica dl programma, prova a inizializzare la stringa parola:

String parola = "parola_di_tua_scelta"

E poi eseguire il programma.

Non cambia nulla :frowning: ho provato.

Comunque la variabile parola nel sorgente è inizializzata in questo modo:

String parola = "";

Ma il bello che prima avevo fatto in mobo di stampare il contenuto di parola poi ho cancellato ero non ricordo come ho fatto :-?

Si ma così non ti stampa niente in ogni caso.
Guarderò con attenzione il tuo programma, ora non posso.

Ok ora ho modificato il codice in questo modo:

[code]import java.io.*;
public class TrovaParola {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub
	int ]] parole;
	String file = args[0];
	File inFile = new File(file);
	BufferedReader reader = null;
	FileInputStream input = null;
	InputStreamReader oddio;
	String parola="";
	if(args.length<2)
		System.out.println("Inserire il nome del file e almeno una parola da cercare");
	if(!inFile.exists())
		System.out.println("Il file non esiste!");
	for(int i = 1; i<args.length; i++){
		input = new FileInputStream(inFile);
		oddio = new InputStreamReader(input);
		reader = new BufferedReader(oddio);
		while(parola!=null){
		parola = reader.readLine();
		if(parola!=null)
		System.out.println(parola);
		//if(parola!=null && parola == args*)
		}
		
	
		
		
	}
}

}[/code]

Ora riesco a stampare il contenuto di parola, stampa le stringhe è grazie al controllo non stamapa la stringa “null”.

Ma se provo a modificare l’ultimo controllo in questo modo:

if(parola!=null && parola == args*)

non stampa più nulla :hammer:**

l’algoritmo è scorretto:
l’inizializzazione della variabile parola è interna al loop sull’array di ricerca.

Quindi cosa faccio? sono fuso…

in pseudo codice l’algoritmo deve essere cosi:

inizializzazione array di ricerca

loop sulle parole ( se hai un array di parole)
inizializzazione parola

loop sull’array
while su parola=array
stampa
chiusura while
chiusura loop array

chiusura loop parole

Prova con questo è comunque una bozza:

import java.io.;
import java.net.
;
import java.util.*;

public class Trova {

public static void main( String] args){
	
	File doc=new File("C:/doc.txt");
    URL path=null;
    Vector<String> result = new Vector<String>();
    try
    {
    

     
      int i;
  
      // apriamo lo stream di input...
      InputStream is=path.openStream();
      BufferedReader br=new BufferedReader(new InputStreamReader(is));
     
      String line = null;

		// Leggi fino alla fine del file
		while ((line = br.readLine()) != null) {
		     result.add(br.readLine());
		}
      
      br.close();
      
      
      
      // Una volta iserite tutte le parole nel vettore ci fai una ricerca!!
      // Cosi dovrebbe funzionare!
      
     
    }
	
    // intercettiamo eventuali eccezioni
    catch (MalformedURLException e)
    {
      System.out.println("Attenzione:" + e);
    }
    catch (IOException e)
    {
      System.out.println(e.getMessage());
    } 
  
	
}

}

[quote=virus]
in pseudo codice l’algoritmo deve essere cosi:

inizializzazione array di ricerca

loop sulle parole ( se hai un array di parole)
inizializzazione parola

loop sull’array
while su parola=array
stampa
chiusura while
chiusura loop array

chiusura loop parole[/quote]

Grazie fra :smiley:

Qui insorge un altro problema se io opto per questa soluzione:

[code]import java.util.;
import java.net.
;
import java.io.*;

import prog.io.ConsoleInputManager;
public class TrovaParola2 {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub

ConsoleInputManager in = new ConsoleInputManager();
String percorso= in.readLine("Inserire il percorso del file: ");
File doc = new File(percorso);
Vector vettore;
if(doc.exists()){
System.out.println(“Il file è stato trovato!”);
vettore = new Vector();
URL path = null;

InputStream is = path.openStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
String line="";
while((line=bf.readLine())!=null)
	vettore.add(bf.readLine());
bf.close();
String parola = in.readLine("Inserire parola da cercare: ");
for(int i=0; i<vettore.size(); i++){
	if(parola==vettore.get(i))
		System.out.println("Trovata: " + vettore.get(i));
}

}
else{
System.out.println(“Il file non esiste!”);
}

}


}[/code]

questo è l’output:

Inserire il percorso del file: /home/Alex/workspace/Exp/bin/forse.txt Il file è stato trovato! Exception in thread "main" java.lang.NullPointerException at TrovaParola2.main(TrovaParola2.java:24)

Come faccio a risolvere ho provato un po ma nulla

Un po’ incasinato, stai facendo complicata una cosa semplice.

matrici vettori ma a cosa vi servono?

devi capire se c’è una parola dentro un file?

BufferedReader br=new BufferedReader(new InputStreamReader(is));

String line = null;
boolean trovata = false;

while (br.ready()){
line = br.readLine();
if (line.equals(parolaDaCercare){
System.out.println(“Parola " +parolaDaCercare+ " trovata”);
trovata = true;
break;
}
}

br.close();

if (!trovata){
System.out.println(“Parola non trovata”);
}

PS con le stringhe, ed in generale con tutti gli oggetti, non si usano == ma gli equals, sono oggetti non tipi di dato primitivo.

[quote=lucadj]
Un po’ incasinato, stai facendo complicata una cosa semplice.

matrici vettori ma a cosa vi servono?

devi capire se c’è una parola dentro un file?

BufferedReader br=new BufferedReader(new InputStreamReader(is));

String line = null;
boolean trovata = false;

while (br.ready()){
line = br.readLine();
if (line.equals(parolaDaCercare){
System.out.println(“Parola " +parolaDaCercare+ " trovata”);
trovata = true;
break;
}
}

br.close();

if (!trovata){
System.out.println(“Parola non trovata”);
}

PS con le stringhe, ed in generale con tutti gli oggetti, non si usano == ma gli equals, sono oggetti non tipi di dato primitivo.[/quote]

Anche con questa soluzione mi da questo output:

Inserire percorso del file: /home/Alex/workspace/Exp/bin/forse.txt Il file è stato trovato! Exception in thread "main" java.lang.NullPointerException at TrovaParola3.main(TrovaParola3.java:22)

Per me c’è qualche problema con:
URL path = null;

Ora provo a cercare una soluzione senza questa variabile;

Infatti il problema stava proprio in:
URL path = null;
ho risolto modificando il codice in questo modo:

[code]import java.util.;
import java.net.
;
import java.io.*;

import prog.io.ConsoleInputManager;
public class TrovaParola3 {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub

ConsoleInputManager in = new ConsoleInputManager();
String percorso = in.readLine(“Inserire percorso del file: “);
File file = new File(percorso);
String parola = “”;
boolean trovata = false;
if(file.exists()){
System.out.println(“Il file è stato trovato!”);
FileInputStream input = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(input);
BufferedReader br = new BufferedReader(isr);
String linea=””;
parola= in.readLine("Inserire parola da cercare: ");
while(br.ready()){
linea=br.readLine();
if(linea.equals(parola)){
System.out.println(“La parola " + parola + " è stata trovata”);
trovata = true;
break;
}
}
}
else
System.out.println(“Il file non esiste!”);

if(!trovata)
	System.out.println("Parola " + parola + " non trovata");

}

}[/code]

Ora il programma funziona :smiley: tutte e due le versioni che abbiamo provato :smiley:

Ora possiamo passare a far fare al programma quello che deve fare cioè trovare appunto una parola in un file e non una stringa, spiego:

in questo modo il programma legge in un file le stringhe e le assegna alla variabile line che poi fa quello che il while gli dice di fare, ma appunto il metodo readLine legge le stringhe e non le parole.ù

Ora bisognerebbe prendere ogni stringa letta tirare fuori dalla stringa ogni parola e associarla ad un’altra stringa.

Capito il motivo della matrice? :-o

Qualcuno ha qualche idea? io sto cercando di capire dal libro come funziona una matrice, è dedicato ad essa molto poco su questo libro…

EDIT: coirrezione vari errori

se non ho capito male tu voi assegnare ogni singola parola ad una stringa… in pratica prendi una linea in input e la spezzi in tutte le parole possibili???

// Questa funzione prende in input una linea, e si preocupa di spezzarla in
// tutte le parole che la costituiscono
public static String] tokenizerAndClear(String line) {

	Vector<String> tmp = new Vector<String>(0);
	StringTokenizer tokenizer = new StringTokenizer(line, " ");

	while (tokenizer.hasMoreElements()) {
		// Prendo il token che e' una stringa
		String t = (tokenizer.nextToken()).trim();

		// t con punteggiatura rimossa
		t = rimuoviPunteggiatura(t);

		// se la lunghezza della parola e' > 0 lo aggiunge al vettore
		// temporaneo
		if (t.length() > 0)
			tmp.add(t);
	}

	String result] = new String[tmp.size()];

	// Ricopia le stringhe dal vettore all'array
	for (int i = 0; i < result.length; ++i)
		result* = tmp.get(i);

	return result;
} // fine*

Grazie fra.

Adesso ho modificato il codice in questo modo:

[code]import java.util.;
import java.net.
;
import java.io.*;

import prog.io.ConsoleInputManager;
public class TrovaParola3 {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub

ConsoleInputManager in = new ConsoleInputManager();
String percorso = in.readLine(“Inserire percorso del file: “);
File file = new File(percorso);
String parola = “”;
boolean trovata = false;
if(file.exists()){
System.out.println(“Il file è stato trovato!”);
FileInputStream input = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(input);
BufferedReader br = new BufferedReader(isr);
String linea=””;

parola= in.readLine("Inserire parola da cercare: ");
while(linea!=null){
	linea=br.readLine();
	StringTokenizer tokenizer = new StringTokenizer(linea, " ?.;:,!/");
	while(tokenizer.hasMoreTokens()){
	String paroleSpezzate = (tokenizer.nextToken()).trim();		
	if(paroleSpezzate.equals(parola)){
		System.out.println("La parola " + parola + " è stata trovata");
		trovata = true;
		break;
		
	}
	
}

}
}
else
System.out.println(“Il file non esiste!”);

if(!trovata)
	System.out.println("Parola " + parola + " non trovata");

}

}[/code]

Il programma funziona cerca la parola e se la trova dice che l’ha trovata:

Inserire percorso del file: /home/Alex/f1.txt Il file è stato trovato! Inserire parola da cercare: slick La parola slick è stata trovata Exception in thread "main" java.lang.NullPointerException at java.util.StringTokenizer.<init>(StringTokenizer.java:200) at java.util.StringTokenizer.<init>(StringTokenizer.java:222) at TrovaParola3.main(TrovaParola3.java:29)

L’unica cosa che l’output termina con queste eccezioni, mi aiutate ad eliminare questi dettagli per avere un output più pulito?

intanto cerco di vedere se riesco a risolvere ora

ok ora non ci dovrebbero essere piu eccezioni il problema era nel ciclo while…

import java.util.;
import java.net.
;
import java.io.*;

public class Trova{

/**
 * @param args
 * @throws IOException 
 */
public static void main(String] args) throws IOException {
	// TODO Auto-generated method stub

File file = new File("/home/Zufuru/Documenti/telnet.txt");
String parola = “”;
boolean trovata = false;
if(file.exists()){
System.out.println(“Il file è stato trovato!”);
FileInputStream input = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(input);
BufferedReader br = new BufferedReader(isr);
String linea="";

parola= "ciao";
linea=br.readLine();
do{
	
	StringTokenizer tokenizer = new StringTokenizer(linea, " ?.;:,!/");
	while(tokenizer.hasMoreTokens()){
	String paroleSpezzate = (tokenizer.nextToken()).trim();		
	if(paroleSpezzate.equals(parola)){
		System.out.println("La parola " + parola + " è stata trovata");
		trovata = true;
		break;
		
	}
	
}
	linea=br.readLine();

}while(linea!=null);
}
else
System.out.println(“Il file non esiste!”);

if(!trovata)
	System.out.println("Parola " + parola + " non trovata");

}

}

Ok, problema risolto grazie a tutti per l’aiuto :slight_smile: