2014-07-06 3 views
2

Я сделать таблицу умножения (от 2 до 9) - то есть 10 случайно сгенерированных образцы, напримерТаблица умножения

2 * 3 = 
4 * 5 = 
... (7 more times) 
9 * 5 = 

Дело в том, все образцы должны быть разными и образцы

5 * 8 = 

и

8 * 5 = 

считается тот же

Моя идея состоит в том, чтобы сделать пару классов, которая описывает пару чисел, которые нужно умножить, переопределить метод равенства, создать случайные числа, создать пару и добавить объекты пар в Set.

public class Pair { 
    private int first; 
    private int second; 

    public int getFirst() { 
     return first; 
    } 

    public int getSecond() { 
     return second; 
    } 

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

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

    public Pair() {} 

    public Pair(int first, int second) { 
     this.first = first; 
     this.second = second; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (o == null || o.getClass() != this.getClass()) 
      return false; 

     Pair that = (Pair) o; 
     return (this.first == that.first && this.second == that.second) || 
       (this.second == that.first && this.first == that.second); 
    } 

    @Override 
    public int hashCode() { 
     int result = 17; 
     int prime = 31; 
     result = result * prime + first; 
     result = result * prime + second; 
     return result; 
    } 

    @Override 
    public String toString() { 
     return first + " * " + second + " ="; 
    } 
} 

public static Pair[] createTable(int count) { 
     Random random = new Random(); 
     Set<Pair> set = new HashSet<Pair>(); 
     while (set.size() < count) { 
      int first = random.nextInt(8) + 2; 
      int second = random.nextInt(8) + 2; 
      set.add(new Pair(first, second)); 
     } 
     return set.toArray(new Pair[count]); 
} 

Проблема состоит в том, что некоторые массивы, которые метод CreateTable() возвращает состоят эквивалентные пары , например, в

[7 * 6 =, 5 * 6 =, 4 * 8 =, 4 * 9 =, 2 * 8 =, 9 * 2 =, 8 * 2 =, 6 * 3 =, 5 * 2 =, 4 * 2 =] 

есть пары 2 * 8 и 8 * 2 не должны быть там

где ошибка?

+0

Простым хешем будет только: 'return first + second;', который не имеет проблемы с упорядочением и является достаточным хорошо распределены по всему набору. –

ответ

4

Ваш hashCode() метод неправильный. hashCode()ДОЛЖЕН вернуть равные значения для двух объектов, которые равны. Пара 5-7 равна паре 7-5 в соответствии с вашим методом equals(), но их hashCode() не то же самое.

Чтобы правильно реализовать hashCode(), вы всегда должны начать с наименьшим номером:

public int hashCode() { 
    int result = 17; 
    int prime = 31; 

    int lowest = first < second ? first : second; 
    int highest = first < second ? second : first; 

    result = result * prime + lowest; 
    result = result * prime + highest; 
    return result; 
} 

или, проще:

public int hashCode() { 
    int lowest = first < second ? first : second; 
    int highest = first < second ? second : first; 
    return Objects.hash(lowest, highest); 
} 

или, еще проще (спасибо @ user2336315):

public int hashCode() { 
    return Objects.hash(Math.min(first, second), Math.max(first, second)); 
} 
+2

или 'return Objects.hash (Math.min (первый, второй), Math.max (первый, второй));' – user2336315

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