2016-10-27 8 views
0
public class Main{ 

public static void main(String[] args) { 

    final Pair<Integer> p = new DefaultPair<>(3,5); 
    p.reverse(); 
    final Pair<Integer> q = new DefaultPair<>(5,3); 
    } 

} 

public interface Pair<F> { 
    F first(); 
    F second(); 
    F reverse(); 
} 

public class DefaultPair<F> implements Pair<F> { 
    private final F first; 
    private final F second; 
    private F reverseFirst; 
    private F reverseSecond; 


    public DefaultPair(F first, F second){//constructor 
    this.first = first; 
    this.second = second; 
    } 

// method that is not working  
@Override 
    public F reverse() { 

    this.reverseFirst = second; 
    this.reverseSecond = first; 

    System.out.println(this); 
    return (F)this; 
    } 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((first == null) ? 0 : first.hashCode()); 
    result = prime * result + ((second == null) ? 0 : second.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof DefaultPair)) 
     return false; 
    DefaultPair<F> other = (DefaultPair) obj; 
    if (first == null) { 
     if (other.first != null) 
      return false; 
    } else if (!first.equals(other.first)) 
     return false; 
    if (second == null) { 
     if (other.second != null) 
      return false; 
    } else if (!second.equals(other.second)) 
     return false; 
    return true; 
} 

@Override 
    public F first(){ 
     return first; 
    } 

@Override 
    public F second(){ 
     return second; 
    } 


@Override 
public String toString() { 
     return "<" + first + ", " + second + ">"; 
    } 

} 

import static org.junit.Assert.*; 

import org.junit.Test; 

public class TestDefaultPair { 

    @Test 
    public void test() { 
     final Pair<Integer> p = new DefaultPair<>(3, 5); 
     final Pair<Integer> q = new DefaultPair<>(5, 3); 
     assertEquals(3, p.first().intValue()); 
     assertEquals(5, p.second().intValue()); 
     assertEquals("<3, 5>", p.toString()); 
     assertTrue(p.equals(p)); 
     assertFalse(p.equals(q)); 
     assertFalse(q.equals(p)); 
     assertFalse(p.equals(null)); 
     assertTrue(p.equals(q.reverse()));//test that is not passing 
    } 

} 

すべてのテストケースが合格する必要があります。私は逆のメソッドを呼び出さなければならない最後のもののほかに、それらのすべてが渡されます。逆方法のレシーバーは変異させてはならない。例えば、私はp(3,5)を入れ替えてはいけません。逆の方法のほかに、他のすべてが機能します。私はp.reverse()を呼び出します。 pをプリントアウトすると、元の順序でプリントされます。Javaの汎用ペアの逆方法

+0

のサイドロー '(obj instanceof DefaultPair)'にはinbuild 'null'チェックがあるため、以前のヌルチェックは不要です。 – SomeJavaGuy

+3

'reverseFirst'と' reverseSecond'フィールドを削除します。 –

+0

また、セッターメソッドがないので、 'final'と' second'フィールドから 'final'修飾子を削除することもできます。 – SomeJavaGuy

答えて

2

equals() DefaultPairの実装では、firstsecondの値が等しいかどうかをチェックします。しかし、reverse()メソッドは、reverseFirstreverseSecondフィールドの値のみを変更します。

あなたは私が間違って何だと思いequals()reverseFirstreverseSecondを使用する必要があるかreverse()

+0

またreverseFirstとreverseSecondを削除して、最初と2番目のスワップされたペアの新しいインスタンスを返すようにmetohd reverseを設計することをお勧めします。 – Wallkan

1

firstsecondの値を変更するかはここにある:F reverse()、あなたの状況では、Fは整数ですが、整数ものではありませんあなたは戻ってくるべきです、あなたはペアを返すべきです。

p.equals(q.reverse()) is like: pair.equals(Integer) 
1

うまくいけば、私はすべてを正しく理解していたが、私はあなたの逆の方法は次のように見ているべきだと思う。最後に

public DefaultPair<F> reverse() { 
    return new DefaultPair<F>(second,first); 
    // Here you should return a new instance of `DefaultPair<F>`, 
    // which uses second as first and first as second. 
    // Now you are left with an non mutable reversed new instance of DefaultPair 

} 

これは論理的にも、あなたのクラスでreverseFirstreverseSecond無用になるだろう、あたかもそれらを取り除かなければならないかのように。

+0

これは正しい方向に私を導いてくれたと思います。私が逆を呼び出してそれを印刷すると、それでも私に元のペアが与えられます。 – ASS466uiuc

+0

@ ASS466uiucここで生成された新しいインスタンスを変数に格納する必要があるためです。あなたが 'DefaultPair'が変更可能であるべきではないと言いましたように、今度は新しい逆のインスタンスを返しています。単に 'p.reverse()'を試してみてください。新しいインスタンスが異なるとみなされます。 – SomeJavaGuy

+0

System.out.println(q.reverse());私は、これは私のプリントラインでしたが、さらにjUnitテストはまだ行われていません – ASS466uiuc