比较器可以直接构造吗?因为比较器是一个接口而变得混乱。

时间:2015-12-29 19:08:06

标签: java interface instance comparator

我看到它直接在这段代码中创建了一个 Comparator ,它可以成功运行,因为Comparator是一个接口而感到困惑。我能找到的所有例子都是实现Comparator接口的类。

public class Solution 
{
    private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>(){
        public int compare(ListNode left, ListNode right) {
            if (left == null) {
                return 1;
            } else if (right == null) {
                return -1;
            }
            return left.val - right.val;
        }
    };

    public ListNode mergeKLists(ArrayList<ListNode> lists) 
    {
        if (lists == null || lists.size() == 0) {
            return null;
        }

        Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(), ListNodeComparator);
        for (int i = 0; i < lists.size(); i++) {
            if (lists.get(i) != null) {
                heap.add(lists.get(i));
            }
        }

        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        while (!heap.isEmpty())
        {
            ListNode head = heap.poll();
            tail.next = head;
            tail = head;
            if (head.next != null) {
                heap.add(head.next);
            }
        }
        return dummy.next;
    }
}

2 个答案:

答案 0 :(得分:3)

实际上,你在这里做的是创建一个匿名类,它实现了接口:

private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>(){ // here starts the implementation
        @Override
        public int compare(ListNode left, ListNode right) {
            if (left == null) {
                return 1;
            } else if (right == null) {
                return -1;
            }
            return left.val - right.val;
        }
    };

实际上与:

相同
public class MyClass implementsComparator<ListNode>(){
        @Override
        public int compare(ListNode left, ListNode right) {
            if (left == null) {
                return 1;
            } else if (right == null) {
                return -1;
            }
            return left.val - right.val;
        }
    };

如果您只需要在一个类中使用该实现一次,则无需创建具有实现的单独类。

答案 1 :(得分:2)

它并没有直接创建比较器,而是anonymous class,其中创建了一个没有名称的类。这相当于:

class A implements Comparator<ListNode> {

    @Override
    public int compare(ListNode left, ListNode right) {
        if (left == null) {
            return 1;
        } else if (right == null) {
            return -1;
        }
        return left.val - right.val;
    }
}

然后:

Comparator<ListNode> listNodeComparator = new A();