La réponse correcte dépend de la façon dont vous voulez utiliser cette classe, si l'égalité et le hashCode doivent être peu coûteux, alors envisager d'initialiser un tableau sur la construction qui peut être facilement comparé. Quelque chose comme ceci:
import java.util.Arrays;
public class Triple {
// Use this array only for hashCode & equals.
private final int[] values;
private final int x;
private final int y;
private final int z;
public Triple(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
this.values = new int[]{x, y, z};
// Sort the values for simpler comparison of equality.
Arrays.sort(values);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Triple triple = (Triple) o;
return Arrays.equals(values, triple.values);
}
@Override
public int hashCode() {
return Arrays.hashCode(values);
}
}
Ajout de quelques tests pour prouver l'égalité et de l'égalité non:
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNot.not;
import org.junit.Assert;
import org.junit.Test;
public class TripleTest {
@Test
public void valuesInDifferentOrderAreEqual() {
Triple sortedTriple = new Triple(1, 2, 3);
Triple outOfOrderTriple = new Triple(3, 2, 1);
Assert.assertThat(sortedTriple, equalTo(outOfOrderTriple));
Assert.assertThat(sortedTriple.hashCode(), is(outOfOrderTriple.hashCode()));
}
@Test
public void valuesInOrderAreEqual() {
Triple sortedTriple = new Triple(1, 2, 3);
Triple outOfOrderTriple = new Triple(1, 2, 3);
Assert.assertThat(sortedTriple, equalTo(outOfOrderTriple));
Assert.assertThat(sortedTriple.hashCode(), is(outOfOrderTriple.hashCode()));
}
@Test
public void valuesThatAreDifferentAreNotEqual() {
Triple sortedTriple = new Triple(1, 2, 3);
Triple outOfOrderTriple = new Triple(7, 8, 9);
Assert.assertThat(sortedTriple, not(outOfOrderTriple));
Assert.assertThat(sortedTriple.hashCode(), not(outOfOrderTriple.hashCode()));
}
@Test
public void valuesWithSameSumAreNotEqual() {
Triple sortedTriple = new Triple(11, 21, 31);
Triple outOfOrderTriple = new Triple(36, 12, 21);
Assert.assertThat(sortedTriple, not(outOfOrderTriple));
Assert.assertThat(sortedTriple.hashCode(), not(outOfOrderTriple.hashCode()));
}
@Test
public void valuesWithSameProductAreNotEqual() {
Triple sortedTriple = new Triple(11, 21, 31);
Triple outOfOrderTriple = new Triple(33, 7, 31);
Assert.assertThat(sortedTriple, not(outOfOrderTriple));
Assert.assertThat(sortedTriple.hashCode(), not(outOfOrderTriple.hashCode()));
}
}
Pourquoi semble t-il vraiment de temps? – BackSlash
Votre méthode égale * ne compare pas les permutations. – shmosel
Cependant, voici un indice pour le rendre "plus court". Vous pourriez avoir une méthode appelée 'asList()' dans votre classe 'Triplet' qui retourne les trois éléments sous forme de liste et fait' return this.asList(). ContainsAll (other.asList()) '- Mais je pense que c'est une manière horrible de résoudre le problème. Le bon moyen est d'utiliser 'if's et de vérifier toutes les conditions nécessaires. – BackSlash