2017-02-10 25 views
-2

请简要介绍一下在此代码中使用compareTo()函数的功能。它正在执行什么工作。如果我们删除compareTo()函数,它会给出错误。Java中的类对象实现

我不知道compareTo()函数的用法,以及它如何影响代码的执行。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.PriorityQueue; 
import java.util.Scanner; 

/** 
* 
* @author rajat 
*/ 
public class ImplementPair { 

    public static int mod = (int) (1e9+7); 


    public static void main(String[] args) 
    { 
      Scanner in=new Scanner(System.in); 
     int n=in.nextInt(); 
     int k=in.nextInt(); 
     PriorityQueue<Pair> pq=new PriorityQueue<>(); 

     for(int i=0;i<n;i++){ 
      int x=in.nextInt(); 
      pq.add(new Pair(x, i+1)); 
      System.out.println("prior "+pq); 
     } 

     for(int i=0;i<k;i++){ 
      Pair p=pq.poll(); 
      System.out.println("prior "+pq); 
      pq.add(new Pair(p.x-1, p.y)); 
      System.out.println("prior "+pq); 
     } 


    } 

    static class Pair implements Comparable<Pair>{ 

     long x,y,i; 



    Pair (long x,long y){ 
     this.x=x; 
     this.y=y; 
    } 

    public int compareTo(Pair o) { 

     if(this.x!=o.x) 
       { 
        System.out.println(-Long.compare(this.x,o.x)); 
        return -Long.compare(this.x,o.x); 

       } 
     else 
        return Long.compare(this.y,o.y); 
     //return 0; 
    } 




     @Override 
     public String toString() { 
      return x + " " + y ; 
     } 

    } 
} 
+1

起初它按X的值排序。然后如果X值相等,它按Y的值排序。负号可能影响排序是升序还是降序。 –

回答

0

您正在使用PriorityQueue进行自然排序。从javaDoc

基于优先级堆的无限优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构建时提供的比较器进行排序,具体取决于使用哪个构造函数。优先级队列不允许空元素。 依赖于自然顺序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。

如果你想删除compareTo(不实现Comparable),你应该使用PriorityQueue构造与Comparator

compareTo implementetion是x只是为了后代和y如果x是升序等于。