簡體   English   中英

在構造函數中使用自定義比較器

[英]Using a Custom-Defined Comparator in a Constructor

我在構造函數中使用比較器時遇到困難。 當我嘗試以下代碼時:

InsertionSorter is = new InsertionSorter(bookList.toArray(new Comparable[bookList.size()]), new GenreComparator(), SortType.ASC);

我收到此錯誤:

no suitable constructor found for InsertionSorter(java.lang.Comparable[],sort.GenreComparator,sort.SortType)
constructor sort.InsertionSorter.InsertionSorter(java.lang.Comparable[],java.util.Comparator<java.lang.Object>,sort.SortType) is not applicable
  (actual argument sort.GenreComparator cannot be converted to java.util.Comparator<java.lang.Object> by method invocation conversion)
constructor sort.InsertionSorter.InsertionSorter(java.lang.Comparable[],sort.SortType) is not applicable
  (actual and formal argument lists differ in length)

以下是有用的代碼段:

AbstractSorter.java:

abstract class AbstractSorter {
    protected Comparable[] values;
    protected Comparator<Object> cmp;
    protected SortType st;

    protected abstract void doSort();
    protected AbstractSorter(Comparable[] init, SortType type) {
        values = new Comparable[init.length];
        System.arraycopy(init, 0, values, 0, init.length);
        cmp = null;
        st = type;
    }
    protected AbstractSorter(Comparable[] init, Comparator<Object> comp, SortType type) {
        values = new Comparable[init.length];
        System.arraycopy(init, 0, values, 0, init.length);
        cmp = comp;
        st = type;
    }

    public Comparable[] getValues() {
        return values;
    }
}

class InsertionSorter extends AbstractSorter {

    public InsertionSorter(Comparable[] init, SortType type) {
        super(init, type);
    }

    public InsertionSorter(Comparable[] init, Comparator<Object> comp, SortType type) {
        super(init, comp, type);
    }

    @Override
    public void doSort() {
        // sorts values
    }
}

enum SortType {ASC, DSC};

Book.java:

public class Book implements Cloneable, Comparable<Book> {
    private Person author; // implementation details of Person don't matter here
    private String title, isbn;
    private int year;
    private BookGenre genre;

    public Book(Person authorInit, String titleInit, String isbnInit, 
            int yearInit, BookGenre genreInit) {
        author = authorInit;
        title = titleInit;
        isbn = isbnInit;
        year = yearInit;
        genre = genreInit;
    }

    @Override
    public String toString() {
        return author.toString() + " " + title + " " + isbn + " " + year 
                + " " + genre;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public int compareTo(Book other) {
        return author.compareTo(other.author);
    }

    public Person getAuthor() {
        return author;
    }

    public String getTitle() {
        return title;
    }

    public String getIsbn() {
        return isbn;
    }

    public int getYear() {
        return year;
    }

    public BookGenre getGenre() {
        return genre;
    }
}

class TitleComparator implements Comparator<Book> {
    @Override
    public int compare(Book a, Book b) {
        return a.getTitle().compareToIgnoreCase(b.getTitle());
    }
}

class GenreComparator implements Comparator<Book> {
    @Override
    public int compare(Book a, Book b) {
        return a.getGenre().compareTo(b.getGenre());
    }
}

enum BookGenre { COMIC, MYSTERY, SCIENCE, TRAVEL };

編輯感謝Rohit為這個問題提供的解決方案,但是現在我遇到了一個相關問題。 doSort()方法中,我有代碼片段

cmp.compare(values[j-1], values[j])

(不用擔心,如果cmp == null ,我將進行檢查以確保不會被調用。這會產生以下錯誤:

method compare in interface java.util.Comparator<T> cannot be applied to given types;
  required: capture#1 of ? extends java.lang.Object,capture#1 of ? extends java.lang.Object
  found: java.lang.Comparable,java.lang.Comparable
  reason: actual argument java.lang.Comparable cannot be converted to capture#1 of ? extends java.lang.Object by method invocation conversion

請注意,我已經在AbstractSort.java中更改了上述內容,將Comparable<Object>替換為Comparable<? extends Object> Comparable<? extends Object>

GenreComparator類實現Comparator<Book> 因此,您不能在需要Comparator<Object>的情況下傳遞該類的實例。 兩者都不兼容。

但是,您可以將Comparator<Object>更改為Comparator<? extends Object> 在構造函數中Comparator<? extends Object> ,在AbstractSorter類中Comparator<? extends Object> cmp的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM