Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-07-2007, 19:25   #1
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
esercizio java videoteca

Salve a tutti,sono nuovo e ho un grosso problema con un esercizio java !!!
Potreste aiutarmi a svolgerlo? L'esercizio è il seguente:

Una videoteca memorizza le informazioni sui titoli disponibili in un file denominato “films.info”. Il file è organizzato in blocchi di righe, uno per ogni film, delimitati dalle stringhe “***inizio***” e “***fine***”. Le prime tre righe contengono il titolo del film e l’anno di produzione. Seguono gli attori protagonisti, in numero variabile, e il regista, secondo il seguente schema:

***inizio***
Titolo Film
Anno Produzione
***attori***
Nome Attore 1
Cognome Attore 1
Nome Attore2
Cognome Attore2

Nome Attore n
Cognome Attore n
***regia***
Nome Regista
Cognome Regista
***fine***

Scrivere un programma che, ricevuti in ingresso Cognome e Nome di un attore e Cognome e Nome di un regista, stampi la lista dei film interpretati dall’attore e diretti dal regista (titolo e anno di produzione).
Vi ringrazio per la vostra attenzione.
Blade86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2007, 20:32   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Postresti iniziare creando una rappresentazione del file "films.info". Intendo per rappresentazione del file un oggetto (in Java una categoria di oggetti, cioè una classe) che faccia da ponte tra i dati contenuti nel file films.info e il resto del sistema. Potrebbe essere una cosa di questo pseudo-tipo:

classe FilmFile
+Collection<Film> getFilms();

Un Film potrebbe essere:

classe Film
+String getTitolo();
+String getAnnoProduzione();
+Regista getRegista();
+Collection<Attore> getAttori();

Un Attore sarebbe:

classe Attore
+String getNome();
+String getCognome();

ed un Regista:

classe Regista
+String getNome();
+String getCognome();


Il sistema potrebbe prevedere l'esistenza di un Archivista a cui deleghi il compito di cercare delle occorrenze in un elenco di film:

classe Archivista
+Collection<Film> cerca(Attore a, Collection<Film> films);
+Collection<Film> cerca(Regista r, Collection<Film> films);

Il programma sarebbe quindi una semplice unione delle definizioni degli oggetti su proposti:

classe Programma:
+void setFilmFile(FilmFile file);
+void setArchivista(Archivista v);
+void cerca(Regista r, Attore a);

Il metodo "cerca" di Programma userebbe l'Archivista sulla collezione di Film nota al FilmFile per ricavare e stampare a video l'elenco di film diretti da r e interpretati da a.

Naturalmente è solo uno dei possibili modelli.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2007, 21:24   #3
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
ok. Ma se vorrei caricare it tutto in un ArrayList tramite i private final String MARCATORE_ .......... = "***.........***; come dovrei fare? e per fare il confronto fra Nome e Cognome attore, e Nome e Cognome regista?
Blade86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2007, 21:48   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Una volta che hai un modello che ti dica chi fa cosa, puoi passare ad esaminare il come.

Nel nostro caso, la domanda "e se volessi riempire un ArrayList tramite i marcatori eccetera eccetera", attiene a come faccia FilmFile a restituire la sua collezione di Film.

Altrimenti detto, FilmFile possiede un metodo getFilms() che restituisce un insieme di riferimenti Film ma come fa concretamente a restituire questi Film? Da dove li prende? E come li prende?

Bene. Come potrebbe funzionare il metodo getFilms() di FilmFile. FilmFile potrebbe avere un costruttore che prende come argomento un File. Quel File sarebbe il percorso del file "film.info". Il costruttore di FilmFile passerebbe poi ad analizzare il testo contenuto in quel file. Nota la forma in cui i singoli film, attori e registi sono conservati nel file (e qui possono entrare in gioco i tuoi marcatori di tipo Stringa), FilmFile creerebbe tanti oggetti Film quanti ne esistono nel file passatogli. Questi oggetti potrebbero essere immagazzinati in un ArrayList di Film. E il metodo getFilms() restituirebbe questo ArrayList (ArrayList è un Collection).

La questione del confronto è ancora un "come". Stavolta è "come fa Archivista a trovare tutti i Film che contengono un certo Attore" (metodo cerca(Attore, Collection<Film>)) e "come fa Archivista a trovare tutti i Film che contengono un certo Regista" (metodo cerca(Regista, Collection<Film>)).

La ricerca di un Attore nel metodo cerca(Attore attore, Collection<Film> films) di Archivista potrebbe essere semplicemente:

crea una lista di Film L inizialmente vuota
per ogni Film F nell'insieme films
-per ogni Attore A nell'insieme di attori di F
--se l'attore A coincide con l'attore cercato
---inserisci il film F nella lista L
---passa al prossimo film nell'insieme films
L contiene tutti i film recitati da attore, restituisci L

Idem per il regista.

Quando sarà il momento di cercare i Film di un certo attore, Programma prenderà la collezione di Film posseduta da FilmFile e la passerà al metodo cerca di Archivista insieme all'attore bersaglio. Archivista restituirà l'insieme di Film contenenti quell'attore. Lo stesso vale per il regista. La ricerca combinata attore+regista sarà fatta ottenendo da Archivista l'elenco di film in cui compare il regista e cercando poi in quell'elenco di film i film in cui compaia l'attore desiderato. Non è il modo più efficiente ma è sintetico.

Ti tornano i conti fin qui?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2007, 22:33   #5
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
si ok. Infatti avevo pensato una cosa del genere, però quando sono andato a caricare gli attori tramite i marcatori nell'ArrayList non me li dà, non potresti dirmi come si fà, io c'ho provato ma non và! in effetti il mio problema è forse quando carico faccio qualche errore. grazie
Blade86 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2007, 18:08   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
In che senso "come si fa"?

Si fa leggendo il file una linea per volta. Oppure lo leggi a blocchi. Prendi uno Scanner, ha un metodo hasNextLine che dice se il file contiene un'altra linea di testo e un metodo nextLine() che ti restituisce la linea di testo successiva.

Il formato è bizzarro ma non è particolarmente complicato.

la prima linea la scarti
la seconda è il titolo
la terza è l'anno di produzione
la quarta la scarti
finchè la linea non vale ***regia***
-la prima è il nome di un attore
-la seconda è il cognome di un attore
questa linea è il nome del regista
questa linea è il cognome del regista
questa linea è ***fine***

Applichi il procedimento finchè ci sono linee e sei a posto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 10:40   #7
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
private final String MARCATORE_ATTORI = "***attori***";
private final String MARCATORE_REGIA = "***regia***";



public void leggi(String file) throws Exception{
Scanner in = new Scanner(new FileReader(file));
Attori b = Attori.read(in);
while (b!=null){


if(in.hasNextLine() && in.nextLine().equals(MARCATORE_ATTORI)) {
while(in.hasNextLine()) {
String linea = in.nextLine();
if(linea.equals(MARCATORE_REGIA)) {
break;
} else {b.aggiungiattori(linea);


}

}
}
s.add(b);
}

il codice l'ho fatto così ma nn và!
Blade86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 12:36   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non va è un po' generico. Genera un'eccezione, non legge correttamente gli attori, li legge ma scarta il regista... tutto è possibile.

Supponendo che Attori.read(Scanner) sia una cosa di questo tipo:

return new Attore(scanner.nextLine(), scanner.nextLine());

mi suona strano il primo:

Attori b = Attori.read(in);

così come il

while(b != null)

L'if lo darei per buono. Se c'è un'altra linea e quella linea vale ***attori*** allora:

prendi una linea.
se la linea vale ***regia*** esci dal ciclo

l'else dovrebbe essere invece:

String nome = linea;
String cognome = in.nextLine();
s.add(new Attore(nome, cognome));
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 14:11   #9
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
Il fatto è : ho un ArrayList<Attore> attori e vorrei caricare la lista degli attori delimitati dai marcatori ***attori*** e ***regia*** nell'ArrayList e poi fare il confronto analizzando quello che c'è nell'ArrayList tramite il for generalizzato. Non è ke potresti postare questa parte del codice grazie!
Blade86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 14:32   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Io posso anche incollarti il codice ma è difficile integrare una soluzione che è frutto di una visione estranea del problema. Ad esempio si potrebbe fare così:

Codice:
package attoregisti;

import java.util.Collection;
import java.util.LinkedList;

public class FilmData {
    private Regista regista;
    private String titolo;
    private String annoProduzione;
    private LinkedList<Attore> attori = new LinkedList<Attore>();
    
    public boolean validate() {
        return regista != null && titolo != null && annoProduzione != null &&
                attori.size() > 0;
    }
    
    public void addAttore(Attore a) {
        attori.add(a);
    }
    
    public Collection<Attore> getAttori() {
        return attori;
    }

    public Regista getRegista() {
        return regista;
    }

    public void setRegista(Regista regista) {
        this.regista = regista;
    }

    public String getTitolo() {
        return titolo;
    }

    public void setTitolo(String titolo) {
        this.titolo = titolo;
    }

    public String getAnnoProduzione() {
        return annoProduzione;
    }

    public void setAnnoProduzione(String annoProduzione) {
        this.annoProduzione = annoProduzione;
    }
    
    
}
Codice:
package attoregisti;

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

public class FilmFile {
    private LinkedList<Film> films = new LinkedList<Film>();
    
    public FilmFile(File file) throws IOException {
        Scanner in = null;
        try {
            FilmData data = new FilmData();
            in = new Scanner(file);
            while(in.hasNextLine()) {
                in.nextLine(); //***inizio***
                data.setTitolo(in.nextLine());
                data.setAnnoProduzione(in.nextLine());
                String line = in.nextLine();
                while(!(line = in.nextLine()).equals("***regia***")) {
                    String nomeAttore = line;
                    String cognomeAttore = in.nextLine();
                    data.addAttore(new Attore(nomeAttore, cognomeAttore));
                }
                data.setRegista(new Regista(in.nextLine(), in.nextLine()));
                in.nextLine(); //***fine***
                films.add(new Film(data));
                data = new FilmData();
            }
        } finally {
            if(in != null) {
                in.close();
            }
        }
    }
    
    public Collection<Film> getFilms() {
        return films;
    }
}
Una versione più rispondente al formato intuibile, che consideri cioè la divisione del file in blocchi e gestisca eventuali malformazioni, sarebbe:

Codice:
package attoregisti;

import java.util.LinkedList;

public class LineBuffer {
    private int cursor = 0;
    private LinkedList<String> lines = new LinkedList<String>();
    
    public void append(String line) {
        lines.add(line);
    }
    
    public void clear() {
        cursor = 0;
        lines.clear();
    }
    
    public String peekNext() {
        return lines.get(cursor);
    }
    
    public String next() {
        return lines.get(cursor++);
    }
    
    public void skip(int count) {
        cursor += count;
    }
    
    public int remaining() {
        return lines.size() - cursor + 1;
    }
    
    public boolean hasRemaining(int count) {
        return cursor + count <= lines.size();
    }
    
    public boolean hasNext() {
        return cursor < lines.size();
    }
    
    public String toString() {
        StringBuilder buffer = new StringBuilder();
        buffer.append("[chunk start]\n");
        for(String line : lines) {
            buffer.append(line).append("\n");
        }
        buffer.append("[chunk end]");
        return buffer.toString();
    }
}
Codice:
package attoregisti;

import java.util.Scanner;

public class FilmParser {
    
    public FilmData parse(LineBuffer data) throws IllegalFormatException {
        FilmData filmData = new FilmData();
        
        if(!data.hasRemaining(2)) {
            throw new IllegalFormatException(data, "not enough lines for header");
        }
        
        filmData.setTitolo(data.next());
        filmData.setAnnoProduzione(data.next());
        
        if(data.hasNext() && data.peekNext().equals("***attori***")) {
            data.skip(1); //skip actors section identifier
            while(data.hasNext() && !data.peekNext().equals("***regia***")) {
                if(data.hasRemaining(2)) {
                    filmData.addAttore(new Attore(data.next(), data.next()));
                } else {
                    throw new IllegalFormatException(data, "not enough lines for actor");
                }
            }
        }
        
        if(data.peekNext().equals("***regia***")) {
            data.skip(1); //skip director section identifier
            if(data.hasRemaining(2)) {
                filmData.setRegista(new Regista(data.next(), data.next()));
            } else {
                throw new IllegalFormatException(data, "not enough lines for director");
            }
        }
        
        if(filmData.validate()) {
            return filmData;
        } else {
            throw new IllegalFormatException(data, "data is not a valid film chunk");
        }
    }
}
Codice:
package attoregisti;

public class IllegalFormatException extends Exception {
    private LineBuffer chunk;
    
    public IllegalFormatException(LineBuffer chunk, String message) {
        super(message);
        this.chunk = chunk;
    }
    
    public String toString() {
        return getMessage() + "\n" + chunk;
    }
}
Codice:
package attoregisti;

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

public class FilmFile {
    private LinkedList<Film> films = new LinkedList<Film>();
    
    public FilmFile(File file) throws IOException {
        final String INIZIO = "***inizio***";
        final String FINE = "***fine***";
        Scanner in = null;
        try {
            in = new Scanner(file);
            FilmParser parser = new FilmParser();
            LineBuffer buffer = new LineBuffer();
            while(in.hasNextLine()) {
                String line = in.nextLine();
                if(line.equals(INIZIO)) {
                    buffer = new LineBuffer();
                } else if(line.equals(FINE)) {
                    try {
                        films.add(new Film(parser.parse(buffer)));
                    } catch(IllegalFormatException ex) {
                        ex.printStackTrace();
                    }
                    buffer.clear();
                } else {
                    buffer.append(line);
                }
            }
        } finally {
            if(in != null) {
                in.close();
            }
        }
    }
    
    public Collection<Film> getFilms() {
        return films;
    }
}
Ma non so quanto possa esserti utile averlo detto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 15:22   #11
Blade86
Member
 
L'Avatar di Blade86
 
Iscritto dal: Jun 2007
Messaggi: 75
non ti preoccupare adesso ho capito di + , ti ringrazio e alla prossima.
Blade86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
La famiglia Xiaomi 17 sta per registrare...
Nuove auto elettriche che vedremo sul me...
E-bike illegali, a Verona il più ...
Quali sono i giochi più venduti su Steam...
HONOR sta per lanciare un nuovo smartpho...
Jared Isaacman sarà alla guida de...
Il Tesla Cybertruck non arriverà ...
Xiaomi Watch 5 è ufficiale: architettura...
CD Projekt vende GOG: il co-fondatore Mi...
Il meglio di Amazon in 26 prodotti, aggi...
L'Europa fa retromarcia sulle pompe di c...
Google investe 4,75 miliardi per i data ...
Meta accelera sullintelligenza artificia...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v