Дублирующиеся значения в hashSet

1

Я пытаюсь подсчитать количество комбинаций 1, 5, 10 и 25, которые суммируются с n. Учитывая, что я не хочу повторений (например, 1 + 5 = 6 и 5 + 1 = 6). Я использую hashSet. Я реализовал класс с именем ResultSet который сохраняет число 1, 5, 10 и 25 в решении, и я переопределяю метод equals. Однако по какой-то причине мое решение hashSet продолжает возвращать повторяющиеся значения. Зачем?

import java.util.HashSet;

public class Solution {

  public static void main(String[] args) {
    int N = 6;
    int combinationsSolution = new Combine(N).getSolution();
    System.out.println("N= " + N + " Number of solutions= " + combinationsSolution);

  }
}

class Combine {

  private int solution;

  private int n;

  private HashSet<ResultSet> cacheUnordered = new HashSet<ResultSet>();

  public Combine(int N) {
    this.n = N;
    this.solution = solve(n);
  }

  public int getSolution() {
    return solution;
  }

  public int solve(int N) {
    solve(N, 0, 0, 0, 0);
    for (ResultSet r:cacheUnordered){
      System.out.println(r.toString());
    }
    return cacheUnordered.size();
  }

  public void solve(int N, int substracted1, int substracted5, int substracted10, int substracted25) {
    if (N == 0) {
      cacheUnordered.add(new ResultSet(substracted1, substracted5, substracted10, substracted25));
    } else if (N > 0) {
      solve(N - 1, substracted1 + 1, substracted5, substracted10, substracted25);
      solve(N - 5, substracted1, substracted5 + 1, substracted10, substracted25);
      solve(N - 10, substracted1, substracted5, substracted10 + 1, substracted25);
      solve(N - 25, substracted1, substracted5, substracted10, substracted25 + 1);
    }
  }
}

class ResultSet {
  private int numberOf1;

  private int numberOf5;

  private int numberOf10;

  private int numberOf25;

  public ResultSet(int num1, int num5, int num10, int num25) {
    numberOf1 = num1;
    numberOf5 = num5;
    numberOf10 = num10;
    numberOf25 = num25;
  }

  @Override
  public String toString(){
    String result;
    result = numberOf1 + " " + numberOf5 + " " + numberOf10 + " " + numberOf25;
    return result;
  }

  @Override
  public boolean equals(Object r2) {
    if (r2 == null) {
      return false;
    }
    if (!(r2 instanceof ResultSet)) {
      return false;
    }
    ResultSet rr = (ResultSet) r2;
    if (rr.numberOf1 == this.numberOf1 && rr.numberOf5 == this.numberOf5
            && rr.numberOf10 == this.numberOf10 && rr.numberOf25 == this.numberOf25) {
      System.out.println("Comparing " + this.toString() + " to " + rr.toString());
      return true;
    } else {
      return false;
    }
  }

  public int getNum1() {
    return numberOf1;
  }

  public int getNum5() {
    return numberOf5;
  }

  public int getNum10() {
    return numberOf10;
  }

  public int getNum25() {
    return numberOf25;
  }
}
Теги:
equals
hashcode
hashset

2 ответа

5
Лучший ответ

Для вашего класса ResultSet вы определили метод equals() но не метод hashCode(). Вам нужны оба метода для правильной работы HashSet. Пожалуйста, ознакомьтесь с этим объяснением. (Он говорит о HashMap, но он также относится к HashSet.)

  • 0
    @JB Nizet Спасибо, что победили меня в редактировании
  • 0
    Пожалуйста :)
3

Как явно определено JavaDoc

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

и вы не следовали за ним, поэтому вы получаете дубликаты,

Прочитайте, как работают HashCode и Equals, это поможет вам лучше понять сказанное выше

  • 0
    Всегда приятно поощрять JavaDocs :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню