Squeak.ru - шаблоны программирования

Переписать массивы с помощью коллекций

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

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

 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"

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


  • Это как-то ожидаемый результат? 17.03.2010
  • да. Это вывод из этого примера тестового кода. 17.03.2010

Ответы:


1

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

Он вернет 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()
}
17.03.2010

2

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

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

17.03.2010

3

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

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

17.03.2010
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...