Allora, proviamo a risolvere una volta per tutte il problema.
Tu hai un file, libri.txt. Ogni riga di questo file contiene informazioni su un libro. Ad esempio potrebbe essere fatto così:
DICKENS, CHARLES, OLIVER TWIST, 8807901544
TOLKIEN, JOHN RONALD REUEL, LO HOBBIT, 8807901474
...
Cioè ogni riga è formata da
COGNOME AUTORE, NOME AUTORE, TITOLO, ISBN
Quindi è MOLTO IMPORTANTE il formato di ogni riga, che sicuramente nel tuo caso sarà diverso da quello che ti ho mostrato.
Quello che devi cercare di fare, adesso, è estrarre riga per riga il contenuto del file in base a come è formattato. Questa operazione è molto semplice se utilizzi la Stream API introdotta con Java 8; però non voglio confonderti le idee per il momento (nel caso fossi curioso fallo sapere).
List<String> righe=null;
try {
righe=Files.readAllLines("libri.txt", Charset.forName("UTF-8");
}catch(IOException e) {righe=new ArrayList<>();}
La lista righe contiene ora tutte le righe del file sotto forma di stringhe.
NB: Potresti leggere il file usando un BufferedReader o altro, alla fine dovresti avere come risultato sempre una lista (o eventualmente un array se sai a priori quanto è righe ci sono nel file) di stringhe che contiene tutte le righe del file.
Ora hai 2 strade che puoi percorrere:
1) Lavori con le stringhe in modo "grezzo" (sconsigliato)
2) "Trasformi" le stringhe in un oggetto Libro.
Io percorrerei la seconda strada, quindi mi scrivo una bella classe Libro.java in questo modo
public class Libro {
//variabili d'istanza
...
public Libro(String nomeAutore, String cognomeAutore, String titolo, String ISBN) { ... }
...
//metodi getter e setter
...
//equals(), toString() e hashCode(). NB: ridefinisci l'equals in modo da stabilire il criterio per cui due libri siano uguali
//ad esempio se hanno lo stesso autore e lo stesso titolo
}
A questo punto faccio la conversione Stringa-Libro
List<Libro> libri=new ArrayList<>();
for(String riga: righe) {
String[] contenutoRiga=riga.trim().split(", ");
//trim() rimuove eventuali spazi all'inizio e alla fine della riga
//split(", ") divide la stringa in sottostringhe che sono separate da ", "(cioè virgola seguita da uno spazio); restituisce un array
String cognome=contenutoRiga[0];
String nome=contenutoRiga[1];
String titolo=contenutoRiga[2];
String ISBN=contenutoRiga[3];
Libro libro=new Libro(nome, cognome, titolo, ISBN);
libri.add(libro);
}
Ok, ora hai una lista di oggetti di tipo Libro.
A questo punto viene il bello, cioè controllare se un libro è presente nella libreria.
Cosa c'è dentro l'array Libreria? Stringhe? Probilmente si. In che formato? Probabilmente lo stesso usato nella riga del file.
La situazione ideale a questo punto sarebbe che l'array Libreria anzichè contenere stringhe contenesse oggetti di tipo Libro, in questo modo potresti tranquillamente scrivere
for(Libro l1: libri) {
boolean trovato=false;
for(Libro l2: Libreria) {
if(l1.equals(l2)) { trovato=true; break; //il libro è presente nella libreria }
}
if(!trovato) //il libro non è presente }
}
Problema risolto. Non ti devi barcamenare ne con substring(), ne con indici di array, ne con regionMatches() (che tra l'altro io non ho avuto mai il bisogno di usare).
Comunque il tuo array Libreria contiene stringhe, devi usare lo stesso procedimento per convertire la stringa in un oggetto di tipo libro.
Quindi riepilogando:
1) Leggi il file e ottieni una lista di stringhe List<String>
2) Dividi ogni stringa della lista in base al formato e ottieni una lista di array di stringhe List<String[]> [*]
3) Converti ogni array di stringhe in un oggetto di tipo Libro e ottieni una lista di libri List<Libro>
4) Segui il passi 2) e 3) per la libreria
5) Usa il metodo equals() ridefinito in Libro per controllare se un libro è presente nella libreria
[*] Per dividere la stringa che rappresenta la riga, in questo esempio, ho usato il metodo split(). In questo e in molti altri casi va più che bene. Altrimenti esiste la classe StringTokenizer, o addirittura la classe StreamTokenizer, ma credo che per il momento non ti interessino.
NBB: Tutto dipende da come è formato il file, quindi la parte più delicata di tutto il programma sta proprio nel dividere ogni riga in base al formato.
EDIT: Non ho resistito, ti posto anche la soluzione utilizzando la Stream API
try(Stream<String> righe=Files.lines("libri.txt") {
righe.map(riga-> riga.split("; ")).
map.(array -> new Libro(array[1], array[0], array[2], array[3])).
filter(libro-> Stream.of(Libreria).anyMatch(l->l.equals(libro))).
forEach(libro -> //fai qualcosa con il libro presente nella libreria);
}