如何给同一堆java的不同实例提供不同的比较器?

时间:2014-11-15 19:26:39

标签: java

我必须编写一个通用堆优先级队列,以及三个独立的比较器类来比较不同的东西。如何将不同的比较器分配给堆的每个实例。所以在我的主要内容中,我会有类似

的内容
GenericHeap D= new GenericHeap <String> ();

GenericHeap S= new GenericHeap <Integer> ();

然后D的方法,比如add和remove,必须使用我所做的比较器,S必须使用不同的方法。如何为堆类的每个实例分配比较器。所有的堆都必须用相同的代码编写,所以我不明白它是如何工作的?

2 个答案:

答案 0 :(得分:0)

您可以将其作为构造函数参数

GenericHeap D = new GenericHeap<String>(new MyStringComparator());

或通过mutator函数

   D.setComparator(new MyStringComparator());

无论哪种方式,您都应该使这些函数采用像IMyComparatorInterface这样的方法,它具有比较方法(T item1,T item2)

public class MyStringComparator implements IMyComparatorInterface

答案 1 :(得分:0)

不是实现Comparator,而是可以为每种类型创建不同的类型,并在那些上调用.compare。用GenericHeap替换List:

    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());

或者使用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());

或者,实现Comparable,在构造函数中传入Comparator并从.compare调用它,如下所示:

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);
    }

}