Я пытаюсь сделать его работающий в течение достаточно долгого времени, но просто, может казаться, не получаю его. У меня есть объектная Башня, созданная из Блока. Я уже сделал это работой с помощью массивов, но я хотел изучить Набор. Я хотел бы получить схожую функциональность к этому:
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.");
}
Как реализовать его?
Первое, что вам нужно изучить, это 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:
Вы переопределили equals и hashCode в классе Block?
РЕДАКТИРОВАТЬ:
Я предполагал, что вы имеете в виду, что это не работает во время выполнения ... вы имели в виду это или во время компиляции ? Если во время компиляции, что это за сообщение об ошибке? Если он вылетает во время выполнения, что такое трассировка стека? Если он компилируется и запускается, но не работает должным образом, вероятная проблема - это equals и hashCode.
Трудно ответить на этот вопрос с предоставленной информацией. Нет ничего особенно плохого в том, как вы используете HashSet.
Что ж, рискну предположить, что это не проблема компиляции, и когда вы говорите «получение ошибок», вы имеете в виду «не получается добиться того поведения, которое [вы] хотите».
Я также продолжу конечность и предположите, что, возможно, методы вашего блока, равные hashCode, неправильно переопределены.