Как использовать Java. Набор

Я пытаюсь сделать его работающий в течение достаточно долгого времени, но просто, может казаться, не получаю его. У меня есть объектная Башня, созданная из Блока. Я уже сделал это работой с помощью массивов, но я хотел изучить Набор. Я хотел бы получить схожую функциональность к этому:

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.");
}

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

15
задан owca 22 March 2010 в 05:38
поделиться

3 ответа

Первое, что вам нужно изучить, это 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 оба или ни одного; никогда только один. (очень важно, потому что оно должно удовлетворять свойству: a.equals(b) == true --> a.hashCode() == b.hashCode()
    • Будьте осторожны с написанием boolean equals(Thing other); это не является правильным @Override.
  • Для не нулевых ссылок x, y, z, equals должны быть:
    • рефлексивными: x.equals(x).
    • симметричными: x.equals(y) тогда и только тогда, когда y.equals(x)
    • транзитивным: если x.equals(y) && y.equals(z), то x.equals(z)
    • последовательным: x.equals(y) не должен меняться, если только объекты не мутировали
    • x.equals(null) == false
  • Общий контракт для hashCode следующий:
    • согласованный: возвращает то же число, если не произошло мутации
    • согласованный с equals: если x.equals(y), то x.hashCode() == y. hashCode()
      • строго говоря, неравенство объектов не требует неравенства хэш-кода
      • но неравенство хэш-кода обязательно требует неравенства объектов
  • То, что считается мутацией, должно быть согласовано между equals и hashCode.

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

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


Дополнительная литература на stackoverflow:

55
ответ дан 1 December 2019 в 00:05
поделиться

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

РЕДАКТИРОВАТЬ:

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

2
ответ дан 1 December 2019 в 00:05
поделиться

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

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

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

1
ответ дан 1 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: