如何为同一堆java的不同实例提供不同的比较器?
我必须编写一个通用堆优先级队列和三个单独的比较器类来比较不同的东西。如何将不同的比较器分配给堆的每个实例。所以在我的主要部分,我会有如何为同一堆java的不同实例提供不同的比较器?,java,Java,我必须编写一个通用堆优先级队列和三个单独的比较器类来比较不同的东西。如何将不同的比较器分配给堆的每个实例。所以在我的主要部分,我会有 GenericHeap D= new GenericHeap <String> (); GenericHeap S= new GenericHeap <Integer> (); genericeap D=新的genericeap(); genericeap S=新的genericeap(); 然后D的方法,比如add和remove,必
GenericHeap D= new GenericHeap <String> ();
GenericHeap S= new GenericHeap <Integer> ();
genericeap D=新的genericeap();
genericeap S=新的genericeap();
然后D的方法,比如add和remove,必须使用我制作的比较器,S必须使用不同的比较器。如何为heap类的每个实例分配一个比较器。所有堆都必须使用相同的代码编写,因此我不明白这是如何工作的?您可以将其作为构造函数参数
GenericHeap D = new GenericHeap<String>(new MyStringComparator());
无论哪种方式,您都应该使这些函数采用类似IMyComparatorInterface的方式,它具有类似Compare(T item1,T item2)的方法
您可以为每个类型和调用创建不同的比较器,而不是实现比较器。用genericeap替换列表:
Comparator<List<String>> stringListComparator = new Comparator<List<String>>() {
@Override
public int compare(List<String> arg0, List<String> arg1) {
// TODO Add comparison code
return 0;
}
};
Comparator<List<Integer>> integerListComparator = new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> arg0, List<Integer> arg1) {
// TODO Add comparison code
return 0;
}
};
stringListComparator.compare(Collections.emptyList(), Collections.emptyList());
integerListComparator.compare(Collections.emptyList(), Collections.emptyList());
比较器stringListComparator=新比较器(){
@凌驾
公共整数比较(列表arg0、列表arg1){
//TODO添加比较代码
返回0;
}
};
比较器整数ListComparator=新比较器(){
@凌驾
公共整数比较(列表arg0、列表arg1){
//TODO添加比较代码
返回0;
}
};
stringListComparator.compare(Collections.emptyList(),Collections.emptyList());
integerListComparator.compare(Collections.emptyList(),Collections.emptyList());
或使用Java 8 lamdas:
Comparator<List<String>> stringListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
Comparator<List<Integer>> integerListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
stringListComparator.compare(Collections.emptyList(), Collections.emptyList());
integerListComparator.compare(Collections.emptyList(), Collections.emptyList());
比较器stringListComparator=(p1,p2)->{
//TODO添加比较代码
返回0;
};
比较器整数ListComparator=(p1,p2)->{
//TODO添加比较代码
返回0;
};
stringListComparator.compare(Collections.emptyList(),Collections.emptyList());
integerListComparator.compare(Collections.emptyList(),Collections.emptyList());
或者,实现Comparable,在构造函数中传入一个Comparator并从中调用它。比较如下:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StackOverflowExample implements Comparable<StackOverflowExample> {
private final Comparator<StackOverflowExample> comparator;
public StackOverflowExample(Comparator<StackOverflowExample> comparator) {
this.comparator = comparator;
}
@Override
public int compareTo(StackOverflowExample arg0) {
return comparator.compare(this, arg0);
}
public static void main(String[] args) {
Comparator<StackOverflowExample> comparator = (p1, p2) -> {
// TODO Add comparison code
};
StackOverflowExample stackOverflowExample = new StackOverflowExample(comparator);
}
}
import java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
公共类StackOverflowExample实现了{
私人最终比较人;
公共堆栈溢出示例(比较器比较器){
这个比较器=比较器;
}
@凌驾
公共整数比较(StackOverflowExample arg0){
返回comparator.compare(this,arg0);
}
公共静态void main(字符串[]args){
比较器比较器=(p1,p2)->{
//TODO添加比较代码
};
StackOverflowExample StackOverflowExample=新的StackOverflowExample(比较器);
}
}
这不是C#:不要用I
启动接口名称,并且要使用camelCase方法名称,例如compare
。另外,已经有了一个接口来满足您的建议:Comparator
。关于该语言的命名约定,这是一个公平的观点。至于现有的比较,也许:)学校项目是学校项目,要求未知。如果我把它作为一个参数,我将如何设置它?我尝试了public genericeap(Comparator C){heap=(E[])new Object[capacity];C compare=new C();但这似乎不起作用?我……所以您似乎缺少了如何实例化和传递参数的基本知识。您只需要一个成员变量“Comparator myComparator”在构造函数中设置为“C”(myComparator=C)(虽然修复了命名,但应该是小写)您可以在callyes中实例化它,我从来没有真正理解过将类作为参数传递,如何传递类的实例,而不是一般的类。只需在构造函数中传递comparator对象,并在堆实现中使用它来比较对象。这就是Java Collections框架中的操作方式
Comparator<List<String>> stringListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
Comparator<List<Integer>> integerListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
stringListComparator.compare(Collections.emptyList(), Collections.emptyList());
integerListComparator.compare(Collections.emptyList(), Collections.emptyList());
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StackOverflowExample implements Comparable<StackOverflowExample> {
private final Comparator<StackOverflowExample> comparator;
public StackOverflowExample(Comparator<StackOverflowExample> comparator) {
this.comparator = comparator;
}
@Override
public int compareTo(StackOverflowExample arg0) {
return comparator.compare(this, arg0);
}
public static void main(String[] args) {
Comparator<StackOverflowExample> comparator = (p1, p2) -> {
// TODO Add comparison code
};
StackOverflowExample stackOverflowExample = new StackOverflowExample(comparator);
}
}