View Full Version : [JAVA] gestire un array
Dimitree
13-06-2010, 17:25
ciao ragazzi
allora, ho un array di stringhe fatto in questo modo:
[0] INIZIO
[1] dato x1
[2] dato x2
[n] dati xn
[n+1] INIZIO
[n+2] dato y1
[n+3] dato y2
[m] dati ym
in pratica nel vettore ci sono tante sezioni, ogni sezione è separata dall'altra dalla stringa INIZIO, quindi quando troviamo questa stringa sappiamo che da là in poi ci sono dati da prendere, fino alla prossima stringa INIZIO. In ognuna di questa sezione ci sono sempre 2 stringhe obbligatorie, invece le prossime n sono variabili, ovvero potrebbe essere 1 o anche 100.
Come posso fare per prendere i dati della prima sezione, metterli in un vettore X, fermarmi al prossimo INIZIO, prendere i dati successivi e metterli in un vettore Y, e così via?
quello che non riesco a fare è lo pseudocodice, lo realizzo in Java ma comunque mi basta capire come fare l'algoritmo
(non è importante il fatto che devo mettere i dati in un vettore, mi interessa il come riuscire a fermarmi quando la prossima stringa è INIZIO, e ricominciare)
bobby1112
14-06-2010, 08:42
puoi spiegare il problema in maniera più comprensibile ciao
Dimitree
14-06-2010, 12:29
provo a essere meno generico..faccio un esempio che però funzionerebbe solo in Java:
un file del tipo
STUDENTE
nome
cognome
esame1
esame2
....
esameN
STUDENTE
nome
cognome
esame1
esame2
....
esameM
STUDENTE
nome
e così via.. Tutto questo è in un vettore
ora vorrei assegnare le stringhe ad un oggetto studente per esempio (o metterle in un vettore per ogni studente e passare il vettore all'oggetto studente), e l'unico modo di assegnarle al giusto studente, è riconoscere i delimitatori STUDENTE. come faccio a fare queste operazioni?
banryu79
14-06-2010, 13:12
Un esempio:
class Studente
{
String nome;
String cognome;
List<String> esami;
public Studente(String nome, String cognome, List<String> esami) {
this.nome = nome;
this.cognome = cognome;
this.esami = esami;
}
...
}
List<Studente> exctractStudenti(Vector data)
{
List<Studente> studenti = new ArrayList<Studente>();
boolean flag = false;
int index = 0, fromIndex = 0, toIndex = 0;
for (String element : data) {
if ("STUDENTE".equals(element)) {
if (flag) {
flag = false;
toIndex = index;
Studente s = readStudente(data.subList(fromIndex, toIndex));
studenti.add(s);
}
else {
flag = true;
fromIndex = index+1;
}
}
index++;
}
return studenti;
}
...
Studente readStudente(List<String> data)
{
String nome = data[0];
String cognome = data[1];
List<String> esami = new List<String>(data.size()-2);
for (int i=2; i<data.size(); i++)
esami.add(data[i]);
return new Studente(nome, cognome, esami);
}
In extractStudenti si itera ogni elemento del vettore in input. Quando l'elemento trovato è il marcatore "STUDENTE" si distingue il caso in cui sia il primo di una doppietta o il secondo, usando il flag. Se è il primo salva l'indice nel vettore del prossimo elemento; se è il secondo salva l'indice attuale e, assieme all'indice precedente prende una sottolista di tutti gli elementi compresi (nome, cognome + n esami) e la passa al metodo readStudente; readStudente legge la lista in ingresso sapendo che i primi due elementi sono nome e cognome di uno studente e tutti gli altri sono gli esami.
@EDIT:
Questo premesso che l'input sia il vettore di stringhe e non il file o uno stream dati.
Perchè in tal caso sarebbe molto più conveniente appoggiarsi alla classe Scanner, usando "STUDENTE" come delimiter.
bobby1112
14-06-2010, 14:01
ciao prova se così va bene
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
public class Studente {
private String nome;
private String cognome;
private LinkedList<String> esami=new LinkedList<String>();
public Studente()
{
}
public Studente(String nome,String cognome)
{
this.nome=nome;
this.cognome=cognome;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public LinkedList<String> getEsami() {
return esami;
}
public void setEsami(LinkedList<String> esami) {
this.esami = esami;
}
public void stampaStudenti()
{
System.out.println("STUDENTE");
System.out.println("Nome"+nome);
System.out.println("Cognome"+cognome);
for(int i=0;i<esami.size();i++)
System.out.println("esame "+i+" "+esami.get(i));
}
public static void main(String[] args)
{
LinkedList<Studente> studenti=new LinkedList<Studente>();
Studente s=new Studente();
int index=0;
// definiamo il percorso al file da leggere
File doc=new File("C:/stud.txt");
URL path=null;
// creaiamo un blocco try-catch per intercettare le eccezioni
try
{
// mostriamo il percorso al file
path=doc.toURL();
System.out.println("Il doc si trova nel percorso" + path);
//mostriamo il nome del file
doc=new File(path.getFile());
System.out.println("Nome del file " + doc);
String line=new String();
// apriamo lo stream di input...
InputStream is=path.openStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
// ...e avviamo la lettura del file con un ciclo
line=br.readLine();
while(line!=null)
{
System.out.println(line);
s.setNome(br.readLine());
s.setCognome(br.readLine());
line=br.readLine();
while(!line.equals("STUDENTE"))
{
s.esami.add(line);
line=br.readLine();
//controllo se è la fine del file
if(line==null)
break;
}
}
studenti.add(s);
s.esami.clear();//CANCELLO GLI ESAMI RELATIVI A QUEL STUDENTE
}
// intercettiamo eventuali eccezioni
catch (MalformedURLException e)
{
System.out.println("Attenzione:" + e);
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
}
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.