1

Books オブジェクトまたは Author オブジェクトのマップを作成する Library クラスがあり、Book オブジェクトの属性を使用してマップを並べ替える必要があります。マップは、書籍用と著者用の 2 つの JTable を作成するために使用され、書籍テーブルの書籍属性である列を並べ替えることができる必要があります。私はマップを使用する必要があり、JTable ソーターだけを使用することはできません。bookIndex をキーとして使用してマップを作成すると、マップは bookIndex で正しくソートされますが、これは自然な順序です。

Book オブジェクトの他の属性によって既に作成されているマップを並べ替えるにはどうすればよいですか。たとえば、bookTitle に基づいて既存のマップを並べ替えたい場合はどうすればよいですか?

コンパレータを使用する必要があることはわかっていますが、検索して試してみましたが、これを理解できません。

メイン (図書館オブジェクトを作成し、書籍と著者オブジェクトを作成して図書館マップに追加します):

    static Library<Book> bookLibrary = new Library<Book>();
    Book book = new Book();
        book.setBookIndex(Integer.parseInt(ar[1]));
        book.setTitle(ar[2]);
        book.setGenre(ar[3]);
        book.setPrice(ar[4]);
        book.setAuthorIndex(Integer.parseInt(ar[5]));

    bookLibrary.add(book.getBookIndex(), book); //adds the book object to library


    static Library<Author> authorLibrary = new Library<Author>();
    Author author = new Author();
                author.setAuthorIndex(Integer.parseInt(ar[1]));
                author.setName(ar[2]);
                author.setStreetAddress(ar[3]);
                author.setCity(ar[4]);
                author.setState(ar[5]);
                author.setZip(ar[6]);
                author.setPhone(ar[7]);

    authorLibrary.add(author.getAuthorIndex(), author); //adds the author object to the library

Book クラス (Author クラスはこれに似ています):

    public class Book implements BookInterface {

        private Integer bookIndex;
        private String title, genre, price;
        private Integer authorIndex;

       ....
    }

ライブラリ クラス:

    public class Library<T> implements LibraryInterface<T> {
        private Map<Integer, T> map = new TreeMap<Integer, T>();
        ...
    }

. . .

今後の参考のために、これを機能させる方法を次に示します。

    public class Library<T> implements LibraryInterface<T> {
        private Map<String, T> map = new TreeMap<String, T>(new bookComparator());

そして新しいクラス:

    public class bookComparator implements Comparator<Object> {

@Override
public int compare(Object o1, Object o2) {
    String bookTitle1 = (String) o1;
    String bookTitle2 = (String) o2;
    int res = bookTitle1.compareToIgnoreCase(bookTitle2);;
    return res != 0 ? res : 1;

        }
    }

そして、新しい TreeMap を作成するメイン クラスでソート メソッドを作成します。元のマップのコピーを作成して元のマップを置き換えますが、今のところ機能します。

    /**
 * Sort The Book Table by Book Title
 * 
 * @param bookLibrary2
 */
private void sortByBookTitle() {
    bookRowElement.clear();
    Library<Book> sortBookLibrary = new Library<Book>();
    for ( Entry<String, Book> entry: bookLibrary.entrySet()) {

        String key = entry.getValue().getTitle();  //Additional sorts can be mad by changing .getTitle() to getWhatever()
        Book value = entry.getValue();
        sortBookLibrary.add(key, value);
    }
    for ( Entry<String, Book> entry: sortBookLibrary.entrySet()) {
        bookRowElement.addElement(createBookSearchList(entry.getValue()));
    }
    bookTable.repaint();
}
4

2 に答える 2