Как использовать java.Set

Я пытаюсь заставить его работать в течение некоторого времени, но просто не может его получить. У меня есть объект Tower, построенный из Block's. Я уже работал с массивами, но мне хотелось узнать Set. Я хотел бы получить аналогичную функциональность:

public class Tower {


public Tower(){
}

public Tower add(Block k1){

    //(...)
    //if block already in tower, return "Block already in tower"
}

public Tower delete(Block k1){

    //(...)
    //if block already dleted, show "No such block in tower"
}

}

Кто-то дал мне код, но я постоянно получаю ошибки при попытке его использовать:

Set<Block> tower = new HashSet<Block>();

boolean added = tower.add( k1 );
if( added ) {
System.out.println("Added 1 block.");
} else {
System.out.println("Tower already contains this block.");
}

Как его реализовать?

Ответы

Ответ 1

Первое, что вам нужно изучить, это java.util.Set API.

Вот небольшой пример того, как использовать его методы:

    Set<Integer> numbers = new TreeSet<Integer>();

    numbers.add(2);
    numbers.add(5);

    System.out.println(numbers); // "[2, 5]"
    System.out.println(numbers.contains(7)); // "false"

    System.out.println(numbers.add(5)); // "false"
    System.out.println(numbers.size()); // "2"

    int sum = 0;
    for (int n : numbers) {
        sum += n;
    }
    System.out.println("Sum = " + sum); // "Sum = 7"

    numbers.addAll(Arrays.asList(1,2,3,4,5));
    System.out.println(numbers); // "[1, 2, 3, 4, 5]"

    numbers.removeAll(Arrays.asList(4,5,6,7));
    System.out.println(numbers); // "[1, 2, 3]"

    numbers.retainAll(Arrays.asList(2,3,4,5));
    System.out.println(numbers); // "[2, 3]"

Как только вы знакомы с API, вы можете использовать его для хранения более интересных объектов. Если вы не знакомы с equals и hashCode, уже сейчас самое подходящее время для начала.

В двух словах:

  • @Override оба или none; никогда не только один. (очень важно, потому что он должен удовлетворять свойству: a.equals(b) == true --> a.hashCode() == b.hashCode()
    • Соблюдайте осторожность при написании boolean equals(Thing other); это не является правильным @Override.
  • Для ненулевых ссылок x, y, z, equals должно быть:
    • reflexive: x.equals(x).
    • симметричный: x.equals(y) тогда и только тогда, когда y.equals(x)
    • transitive: if x.equals(y) && y.equals(z), то x.equals(z)
    • compatible: x.equals(y) не должен изменяться, если объекты не были мутированы
    • x.equals(null) == false
  • Общий контракт для hashCode:
    • cons: возвращать тот же номер, если не произошло мутация
    • соответствует equals: if x.equals(y), то x.hashCode() == y.hashCode()
      • строго говоря, объектное неравенство не требует неравенства хеш-кода
      • но неравенство хеш-кода обязательно требует объектного неравенства
  • То, что считается мутацией, должно быть последовательным между equals и hashCode.

Затем вы можете наложить порядок своих объектов. Вы можете сделать это, создав свой тип Comparable или предоставив отдельный Comparator.

Имея либо упрощает сортировку ваших объектов (Arrays.sort, Collections.sort(List)). Он также позволяет использовать SortedSet, например TreeSet.


Другие чтения в stackoverflow:

Ответ 2

Вы переопределили equals и hashCode в классе Block?

EDIT:

Я предположил, что вы имеете в виду, что он не работает во время выполнения... вы имели в виду это или во время компиляции? Если время компиляции является сообщением об ошибке? Если во время выполнения он падает, какова трассировка стека? Если он компилируется и запускается, но не работает правильно, равные и hashCode являются вероятной проблемой.

Ответ 3

Трудно ответить на этот вопрос с предоставленной информацией. Ничто не выглядит особенно ошибочным в том, как вы используете HashSet.

Хорошо, я буду опасаться, что это не проблема компиляции, и когда вы говорите "получение ошибок", вы имеете в виду "не получить поведение [вы]".

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

Ответ 4

Поскольку это HashSet, вам необходимо переопределить методы hashCode и equals. http://preciselyconcise.com/java/collections/d_set.php имеет пример, объясняющий, как реализовать методы hashCode и equals