Переписать массивы с использованием коллекций - PullRequest
0 голосов
/ 17 марта 2010

У меня есть задача, которую я смог выполнить с помощью простейших методов - массивов. Теперь я хотел бы пойти дальше и переделать его, используя некоторые более сложные функции Java, такие как коллекции, но я никогда не использовал ничего более сложного, чем 2d матрица. На что мне смотреть и с чего начать. Должна ли башня стать коллекцией? И вот задача:

У нас есть два класса - Башня и Блок. Башни построены из блоков. И вот пример кода для тестирования:

 Block k1=new Block("yellow",1,5,4);
 Block k2=new Block("blue",2,2,6);
 Block k3=new Block("green",3,4,2);
 Block k4=new Block("yellow",1,5,4);

 Tower tower=new Tower();
 tower.add(k1,k2,k3);

 "Added 3 blocks."

 System.out.println(tower);

 "block: green, base: 4cm x 3cm, thicknes: 2 cm
 block: blue, base: 6cm x 2cm, thicknes: 2 cm
 block: yellow, base: 5cm x 4cm, thicknes: 1 cm"

 tower.add(k2);

 "Tower already contains this block."

 tower.add(k4);

 "Added 1 block."

 System.out.println(tower);

 "block: green, base: 4cm x 3cm, thicknes: 2 cm
 block: blue, base: 6cm x 2cm, thicknes: 2 cm
 block: yellow, base: 5cm x 4cm, thicknes: 1 cm      
 block: yellow, base: 5cm x 4cm, thicknes: 1 cm"

 tower.delete(k1);

 "Deleted 1 block"

 tower.delete(k1);

 "Block not in tower"

  System.out.println(tower);

 "block: blue, base: 6cm x 2cm, thicknes: 2 cm
 block: yellow, base: 5cm x 4cm, thicknes: 1 cm      
 block: yellow, base: 5cm x 4cm, thicknes: 1 cm"

Скажем, я буду рассматривать Башню как набор блоков. Как выполнить поиск определенного блока среди всей коллекции? Или я должен использовать другой интерфейс?

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

Вы можете использовать в качестве коллекции Набор , который предотвращает дублирование элементов.

Он вернет false, если вы попытаетесь добавить элемент, который уже присутствует.

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

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

Чтобы узнать, содержит ли набор элемент, класс должен правильно реализовать метод equals () .

Для предоставления сообщений с описанием вы можете переопределить метод toString () и выполнить итерацию набора:

 for( Block b : set ) {
     System.out.println( b ); // invokes b.toString()
}
1 голос
/ 17 марта 2010

Вы можете использовать Set .

При использовании набора вам не нужно искать дубликаты (я полагаю, поэтому вам нужна функция поиска), поскольку при использовании метода add (E) возвращается флаг, указывающий дубликат.

1 голос
/ 17 марта 2010

Если бы в вашем классе Tower была переменная-член, представляющая собой коллекцию ( Set , по-видимому, соответствовал бы вашим потребностям запретить дубликаты), то вы могли бы предоставить те же средства доступа, что и в реализации массива.

Вы бы тогда сохранили свою модель домена Башен и Кирпичей. Вы также можете скрыть реализацию внутренней структуры данных от клиентов, и вам не нужно будет полностью реализовывать интерфейс коллекций, который может включать методы, которые вам на самом деле не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...