2015-10-13 4 views
2

У меня есть класс в java, который содержит два целых числа и массив целых чисел в качестве членов, и я хочу сделать хэш-карту с указанным выше объектом в качестве ключа. Как мне переопределить оператор equals и hashCode() таким образом, чтобы объект, который имеет те же значения Integer, что и члены и те же записи в массиве, получает один и тот же код хэша? (Или это возможно даже так). Спасибо в Advance.Переопределение hashCode() в java для класса, содержащего массив

+3

Возможный дубликат [Переопределить равные] (http://stackoverflow.com/questions/8180430/how-to-override-equals-method-in-java) – sam

+0

Я написал это некоторое время назад, как способ сделать то, что вы пытаетесь сделать это последовательно. Может быть полезно: http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/util/PrimaryKey.java – ControlAltDel

+0

@ sam2090 Я думаю, что этот вопрос требует, чтобы исправить использование 'equals' и' hashCode' на * массивы *, а не на целые числа. – Clashsoft

ответ

1

Для вычисления хэш-код для Int массива можно использовать java.util.Arrays.hashcode(int[]).

Если вы посмотрите на его реализацию:

public static int hashCode(int a[]) { 
    if (a == null) 
     return 0; 

    int result = 1; 
    for (int element : a) 
     result = 31 * result + element; 

    return result; 
} 

вы можете получить представление о том, как вычислить хэш-код для класса, который должен быть на основе значений ваших двух целых чисел и целочисленного массива:

public class MyClass { 
    private int a, b; 
    private int[] array; 

    public int hashCode() { 
     return (31 * (31 * Arrays.hashCode(array) + a)) + b; 
    } 

Для равна реализации может выглядеть следующим образом:

public int equals(Object o) { 
     if (o instanceof of MyClass) { 
      MyClass m = (MyClass)o; 
      return m.a == a && m.b == b && Arrays.equals(m.array, array); 
     } 
     else 
      return false; 
    } 
4

Использование java.util.Arrays#equals(int[], int[]) и Arrays.hashCode(int[])

+0

Просто предостерегающее замечание о том, что Arrays.equals и Arrays.hashCode нельзя применять к * произвольным * массивам: проверьте Arrays.deepEquals и Arrays.deepHashCode. – laune

+0

@laune, конечно, сейчас лучше. – davmac

0

Вы можете проверить массив равенства, используя класс java.util.Arrays:

int[] array1 = { 1, 2, 3 }; 
int[] array2 = { 1, 2, 3 }; 

boolean equal = Arrays.equals(array1, array2) // --> true 

Для вычисления хэш-кода массива, тот же класс может помочь вам, а также:

int hash = Arrays.hashCode(new int[] { 1, 2, 3 }) 

Обратите внимание, что класс имеет перегруженные методы для всех типов массивов, включая Object[].

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