gpt4 book ai didi

java - 在构造函数中使用自定义比较器

转载 作者:行者123 更新时间:2023-11-30 07:09:44 27 4
gpt4 key购买 nike

我在构造函数中使用比较器时遇到困难。当我尝试以下代码时:

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)

以下是有用的代码片段:

抽象排序器.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};

书.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>

最佳答案

GenreComparator类(class)工具Comparator<Book> .所以你不能传递那个类的实例,其中 Comparator<Object>是必须的。两者都不兼容。

但是您可以更改 Comparator<Object>Comparator<? extends Object>在你的构造函数中,还有字段类型 cmpAbstractSorter类。

关于java - 在构造函数中使用自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com