Devo caricare una matrice da file.
Però i dati per riempire la matrice sono dopo una certo carattere.
Per riempirla ho fatto un ciclo ma come faccio a dirgli di prendermi solo i caratteri dopo una certa riga?
Devo caricare una matrice da file.
Però i dati per riempire la matrice sono dopo una certo carattere.
Per riempirla ho fatto un ciclo ma come faccio a dirgli di prendermi solo i caratteri dopo una certa riga?
Dovresti usare o un ciclo while o un controllo if.
Posta il codice così vediamo che fare![]()
import java.io.*;
public class Test {
static int N;
private static BufferedReader b;
public static void main(String [] args) throws IOException
{
FileReader file = new FileReader("input.txt");
b = new BufferedReader(file);
String s;
s=b.readLine();
N=Integer.parseInt(s);
b.close();
file.close();
}
public int[][] GeneraMatrice(int[][] Matrice)
{
Matrice = new int[N][N];
return Matrice;
}
}
Per adesso sono qua.
Ovvero sul mio file caricato nella prima riga trovo le dimensioni della mia matrice, nella seconda un asterisco e dalla terza in poi tutti i caratteri con cui devo riempire la matrice.
Io avevo pensato di ultizzare un metodo del Buffered reader che mi leggeva solo dalla 3 riga in poi così che riuscivo ad eliminare le prime due... ma forse è meglio mettere un ciclo while e all'interno aggiungere un ciclo if.
Perche dopo la mia matrice nel file ci sono altre cose che devo leggere dopo aver riempito la matrice.
quindi faccio un ciclo while e gli dico che se arriva all'asterisco da lì in poi deve riempirmi la matrice e se incontra il cancelletto(ovvero il caraterre alla fine della matrice) deve leggermi quello che sta sotto. Puoi aiutarmi?
Puoi mettere anche il contenuto del file?
Inizializzi un array unidimensionale con il contenuto del file.codice:FileReader file = new FileReader("input.txt"); b = new BufferedReader(file); String in=null; int i=0; while((in=b.readLine())!=null) //calcolo il numero di righe nel file { i++; } String[] a = new String[i]; for (int k=0;k<a.length;k++) { a[k]=b.readLine(); }
Poi non ho ben capito come è strutturato il file.
15
*
ESAFAMELBORPOZE
MTOTEQEVIRCSFCE
SDSTTNLHTIMSFUD
CITGSUGBANDTUOI
IVRUPORAMREFBCE
MEAIATGFTNOCSOR
MRTDDRDAENORRPO
ITEIEOINEMOIPOL
AIGANCTRPIPMRSO
UTIORETAEMOIEID
SIAAEUGAABRNZTA
CAMMINAVRAIEIIM
ARTSONOPRRTLOVM
ACATUDESNNONSOO
TALOBMABEAMVOSS
#
SMITH
TENENTE
FERMA
PROBLEMA
VORRA
STRATEGIA
AGOSTO
FRUTTA
NOIA
PAURA
GUIDI
SCIMMIA
CAMMINA
POSITIVO
SOMMA
SPADE
TRENO
TIRO
CORTO
MONTAGNE
CRIMINE
TUOI
LIBERI
SCRIVE
COMPAGNO
BAMBOLA
VAMPIRO
SEDUTA
BAND
DOLORE
DONO
PREZIOSO
DIVERTITI
BUFFO
NOSTRA
CUOCO
FASE
IDEE
Questo è il file.
Ti spiego brevemente quello che devo fare.
Il programma che devo scrivere è un risolutore di parole incrociate.
15 è la dimensione della matrice che è quadrata.
e per farla ho fatto così:
FileReader file = new FileReader("input.txt");
b = new BufferedReader(file);
String s;
s=b.readLine();
N=Integer.parseInt(s);
b.close();
file.close();
Ovvee con file reader ho preso il file gli ho fatto leggere solo la prima riga (s=b.readLine() poi l'ho convertita in intero xk me la legge stringa e poi ci ho costruito la matrice:
Matrice = new int[N][N];
return Matrice;
Per adesso funzione l'unica cosaè che nn so riempire la matrice.
Comunque andando avanti il programma crea la matrice come detto sopra la riempie con tutto quello che sta dopo l'asterisco e prima del cancelletto e poi deve prendere le parole sottostanti cercarle all'interno della matrice e cancellarle da essa.
Alla fine deve stamparmi un file di testo (output.txt) che è il seguente(non prenderlo come riferimento perchè è sbagliato):
SMITH 2 11 OVEST
TENENTE 3 11 SUD-OVEST
FERMA 4 11 OVEST
PROBLEMA 0 11 OVEST
VORRA 14 11 NORD-OVEST
STRATEGIA 2 2 SUD
AGOSTO 6 7 NORD-OVEST
FRUTTA 5 7 NORD-OVEST
NOIA 13 11 NORD-EST
PAURA 12 7 NORD-OVEST
GUIDI 3 3 SUD
SCIMMIA 2 0 SUD
CAMMINA 11 0 EST
POSITIVO 6 13 SUD
SOMMA 14 14 NORD
SPADE 3 4 SUD
TRENO 9 6 NORD-EST
TIRO 12 10 NORD
CORTO 8 5 NORD
MONTAGNE 8 11 NORD-OVEST
CRIMINE 5 11 SUD
TUOI 3 11 EST
LIBERI 12 11 NORD-OVEST
SCRIVE 1 11 OVEST
COMPAGNO 5 11 SUD-OVEST
BAMBOLA 14 7 OVEST
VAMPIRO 11 7 NORD-EST
SEDUTA 13 7 OVEST
BAND 3 7 EST
DOLORE 9 14 NORD
DONO 6 6 SUD-OVEST
PREZIOSO 7 12 SUD
DIVERTITI 2 1 SUD
BUFFO 4 12 NORD
NOSTRA 12 5 OVEST
CUOCO 1 13 SUD
FASE 0 3 OVEST
IDEE 3 14 NORD
*
ZMTQLSIUSAEAORACNNTEAMS
Ora ti spiego che significa:
es. SMITH 2 11 OVEST
SMITH parola da cercare
2 11 rispettivamente riga e colonna dove inizia la parole quindi della prima lettera
OVEST il verso da dove devo leggere la parola dopo la prima lettera
alla fine ricercate tutte le parole deve andare a capo mettere un asterisco andare ancora a capo e scrivere in ordine da sinistra verso destra per tutte le righe tutte le lettere rimenenti.
Quindi se il file rimane sempre quello intendo come struttura puoi procedere come hai iniziato.
Per prima cosa leggi la prima riga e dai le dimensioni alla matrice.
Poi invece che array come ti ho detto puoi usare un ArrayList, che ad ogni elemento associa un Array di stringhe
Per cui avrai un ArrayList<String> composto da 15 elementi String[]. Ora per ognuno di essi fai un ciclo for che va da 1 a 15 ( quindi [1],[2],[3] e così via) e carichi le varie righe della matrice.
Ti servono due cicli for annidati per questo scopo. Il primo che scorre tra i 15 elementi dell'arraylist, e il secondo all'interno del primo che prende ogni carattere di quelle String[15] e lo mette nella matrice.
Per il secondo punto, quello della ricerca delle parole non saprei come procedere.
In ogni caso dovresti ricorrere di nuovo ai cicli for, con una condizione if che controlli che l'index di un carattere rispetto ad un altro sia adiacente (orizzontalmente verticalmente o diagonalmente).
Quindi ti converrebbe fare un altro arraylist con le parole dopo il cancelletto (dalla riga 17 in poi) e prendendo per esempio "smith". Con un ciclo for trovare ogni carattere s nella matrice con indice ad esempio [n][m], vedere se quello [n][m+1] [n+1][m] [n+1][m+1] ecc corrisponde a m, e questo per ogni carattere della parola. E' sicuramente più corto a scrivere che a dirlo. Perchè faresti ricorso ad un for(int i=0;i<arralylist.get(1).lenght();i++) ad esempio per la prima parola e così via.Al posto di 1 ci andrà un'altra variabile contatore assegnata ad un ciclo for che contiene quello scritto. E così via.
Spero di essere stato di aiuto.
EDIT:
Per il file di output, i versi delle parole li determini di già quando fai il controllo con gli indici, quindi usi una variabile boolean con i versi o come meglio credi. Poi per gli indici basta usare i contatori del ciclo for, e per la parola il contatore assegnato all'arraylist con out.write(arraylist.get(i).toString()) mi sembra.