まず第一に、誰かがすでにこの質問を投稿していることを知っていますが、残念ながら彼らの解決策では私の問題を解決できません。
説明させてください。Book クラス (Libro) と、抽象クラスを拡張する具象クラス (LibroConcreto) があります。また、Books (タイプ T) のコンテナーを特徴とする Catalog クラスがあります。私がすべきことは、本をコンテナーに割り当て、他のメソッドで、ユーザーの選択に応じて、タイトルまたは年 (book クラスの属性) でソートされたこの本のコンテナーのコピーを返すことです。これを行うには、TreeSet と、Comparator クラスを実装する 2 つのクラスを使用します。
ただし、ブックをカタログの属性リストに割り当てる際のメインでは、実行時に次の例外がスローされます。
Exception in thread "main" java.lang.ClassCastException: class trac1settembre2019.libro.LibroConcreto cannot be cast to class java.lang.Comparable (trac1settembre2019.libro.LibroConcreto is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base / java.util.TreeMap.compare (TreeMap.java:1291)
at java.base / java.util.TreeMap.put (TreeMap.java:536)
at java.base / java.util.TreeSet.add (TreeSet.java:255)
at trac1september2019.catalogue.Catalogue.addbook (Catalog.java:28)
at trac1settembre2019.test.TestProgramma.main (TestProgramma.java:42)
以下は私のコードです:
package traccia1settembre2019.catalogo;
import java.util.Comparator;
import traccia1settembre2019.libro.Libro;
public class LibriByAnno implements Comparator <Libro>{
public int compare (Libro obj1, Libro obj2) {
return obj1.getAnnoPubblicazione()-obj2.getAnnoPubblicazione();
}
}
package traccia1settembre2019.catalogo;
import java.util.Comparator;
import traccia1settembre2019.libro.Libro;
public class LibriByTitolo implements Comparator <Libro>{
public int compare (Libro obj1, Libro obj2) {
return obj1.getTitolo().compareToIgnoreCase(obj2.getTitolo());
}
}
package traccia1settembre2019.test;
import traccia1settembre2019.catalogo.Catalogo;
import traccia1settembre2019.libro.*;
import java.util.Scanner;
import java.util.Set;
public class TestProgramma {
public static void main(String[] args) {
int numeroLibri;
Catalogo<LibroConcreto> c1=new Catalogo ();
int maxNumLibri=Catalogo.getMaxLibri();
LibroConcreto l;
Scanner in=new Scanner (System.in);
String stringa;
int anno;
int numeroCopie;
int maxCopie=Libro.getMaxCopie();
do {
System.out.println ("Quanti libri vuoi inserire?");
numeroLibri=in.nextInt();
} while (numeroLibri>maxNumLibri);
stringa=in.nextLine();
for (int i=0; i<numeroLibri; i++) {
System.out.println ("Inserire il titolo: ");
stringa=in.nextLine();
System.out.println ("Inserire l'anno di pubblicazione");
anno=in.nextInt();
do {
System.out.println ("Inserire il numero di copie disponibili, deve essere un numero minore di "+maxCopie);
numeroCopie=in.nextInt();
} while (numeroCopie>maxCopie);
l=new LibroConcreto (stringa, anno, numeroCopie);
c1.aggiungiLibro(l);
}
Set <LibroConcreto> c1OrdinatoByAnno=c1.leggiLibriByAnno();
for (Libro l2: c1OrdinatoByAnno) {
System.out.println (l2);
}
Set <LibroConcreto> c1OrdinatoByTitolo=c1.leggiLibriByAnno();
for (Libro l3: c1OrdinatoByTitolo) {
System.out.println (l3);
}
}
}
package traccia1settembre2019.catalogo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import traccia1settembre2019.libro.Libro;
public class Catalogo <T extends Libro>{
private Set <T > libri;
private int codice;
private int numLibri;
private static int numeroCataloghi;
private static final int MAX_LIBRI=300;
public Catalogo () {
libri=new TreeSet <> ();
numeroCataloghi++;
codice=numeroCataloghi;
numLibri=0;
}
public boolean aggiungiLibro (T obj) {
if (numLibri<MAX_LIBRI) {
libri.add(obj);
numLibri++;
return true;
}
return false;
}
public Set<T> leggiLibriByAnno () {
Set <T> copia=new TreeSet <>(new LibriByAnno());
copia.addAll(libri);
return copia;
}
public Set<T> leggiLibriByTitolo () {
Set <T> copia=new TreeSet <>(new LibriByTitolo());
copia.addAll(libri);
return copia;
}
public int numLibriCatalogabili () {
return MAX_LIBRI-numLibri;
}
public String libroAntico () {
List <Libro> lista=new ArrayList <> ();
lista.addAll(libri);
Libro l=Collections.min (lista, new LibriByAnno());
return l.getTitolo();
}
public void eliminazioneLibri () {
this.libri.clear();
}
public int hashCode () {
final int prime=31;
int result=1;
result=prime*result+codice;
return result;
}
public boolean equals (Object obj) {
if (obj==this)
return true;
if (obj==null)
return false;
if (getClass()!=obj.getClass())
return false;
Catalogo <T> other=(Catalogo<T>)obj;
if (other.getCodice()==codice)
return false;
return true;
}
public int getCodice() {
return codice;
}
public String toString () {
return "Catalogo: [codice="+codice+", numero di libri:"+numLibri+", libri="+libri+"]";
}
public static int getMaxLibri() {
return MAX_LIBRI;
}
}
package traccia1settembre2019.libro;
public abstract class Libro {
private String titolo;
private int annoPubblicazione;
private int numCopieDisponibili;
private static final int MAX_COPIE_DISPONIBILI=5;
public Libro (String titolo, int anno, int numCopie) {
this.titolo=titolo;
this.annoPubblicazione=anno;
this.numCopieDisponibili=numCopie;
}
public String getTitolo() {
return titolo;
}
public int getAnnoPubblicazione() {
return annoPubblicazione;
}
public int getNumCopieDisponibili() {
return numCopieDisponibili;
}
public String toString () {
return "Libro: [ titolo="+titolo+", anno di pubblicazione="+annoPubblicazione+", numero di copie disponibili="+numCopieDisponibili;
}
public static int getMaxCopie () {
return MAX_COPIE_DISPONIBILI;
}
}
package traccia1settembre2019.libro;
public class LibroConcreto extends Libro {
public LibroConcreto(String titolo, int anno, int numCopie) {
super(titolo, anno, numCopie);
}
public String toString () {
return super.toString()+"]";
}
}