2015-09-18 3 views
1
public class Pair<F,S> implements Comparable<Pair<F,S>> { 
public F first; 
public S second; 

public F first() { 
return first; 
} 

public void setFirst(F first) { 
this.first=first; 
} 

public S second() { 
return second; 
} 

public void setSecond(S second) { 
this.second=second; 
    } 

public Pair(F first, S second) { 
super(); 
    this.first=first; 
    this.second=second; 
    } 

public int hashCode() { 
    return(first.hashCode()^second.hashCode()); 
} 

    @Override 
public boolean equals(Object obj) { 
return obj instanceof Pair && ((Pair)obj).first.equals(first) &&  (Pair)obj).second.equals(second); 
    } 

    public String toString() { 
    return first + "/" + second; 
    } 

    @SuppressWarnings("unchecked") 
    public int compareTo(Pair<F, S> o) throws ClassCastException{ 

int firstCompared = ((Comparable<F>) first).compareTo(o.first()); 
if(firstCompared!=0) return(firstCompared); 
return(((Comparable<S>)second).compareTo(o.second())); 
     } 

    } 

и и у меня есть следующий класс:Как использовать функцию CompareTo в Java

public class Point{ 

public int x; 
public int y; 

Point(int x, int y){ 
    this.x = x; 
    this.y = y; 

} 

public String toString(){ 

    return "(" + x + "," + y + ")"; 
    } 
} 

Мой вопрос: Пусть у меня есть четыре точки p1, p2, p3, p3. Как я могу использовать класс Pair для сравнения пары (p1, p2) с (p2, p3)? Как я могу использовать функцию compareTo? Спасибо

+1

возможно дубликат [метод CompareTo Java] (http://stackoverflow.com/questions/10017381/compareto-method-java) – panmari

+0

точка не имеет никакого отношения с пар в вашем коде ... –

ответ

5

Вы не можете использовать это, так как ваш класс Point не реализует Comparable<Point>. Вы должны это исправить. И фактически, вы должны ограничить свои F и S только классами, которые реализуют Comparable.


Чтобы ограничить F и S, изменение класса декларацию:

public class Pair<F extends Comparable<F>, S extends Comparable<S>> implements Comparable<Pair<F,S>> { 

С, что вам больше не придется бросить в compareTo:

@Override 
public int compareTo(Pair<F, S> that) { 
    int cmp = this.first.compareTo(that.first); 
    if (cmp == 0) 
     cmp = this.second.compareTo(that.second); 
    return cmp; 
} 

При написании кода ниже, компилятор скажет вам, что Point должен реализовать Comparable<Point>.

После того, как вы сделаете это, вы можете:

Pair<Point, Point> pair1 = new Pair<>(p1, p2); 
Pair<Point, Point> pair2 = new Pair<>(p3, p4); 
int cmp = pair1.compareTo(pair2); 
+1

Предложение: вы должны показать, как сделать ограничение, чтобы помочь людям, которые не владеют дженериками. – Andreas

+0

@Andreas: Я нажимаю на время, поэтому я опубликовал неполный ответ, но сделал его вики-сообществом (я не получаю кредит за голоса). Пожалуйста, не стесняйтесь улучшать его, если можете. Благодаря! –

+0

Спасибо вам много: он работает сейчас :) – user2869180

Смежные вопросы