Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Навчально-науковий інститут атомної та теплової енергетики
Кафедра цифрових технологій в енергетиці
ЛАБОРАТОРНА РОБОТА №6
з дисципліни «Програмування на мові Java»
Варіант № 9
Тема: Перевизначення методів класу ObjectМета: Розробити консольний додаток..Завдання:
Розробити консольний додаток, що відповідає вимогам, наведеним у кожному зпідпунктів завдання. Коректно перевизначити для кожного класу методи equals(), hashCode(), toString().
1. Створити об’єкт класу Text, використовуючи клас Paragraph.
Методи забезпечують можливість:
Доповнення тексту;
Виведення тексту на консоль;
Виведення заголовку тексту.
2. Створити об’єкт класу Ukraine, використовуючи клас Region (область).
Методи забезпечують можливість:
Виведення в консоль столиці;
Виведення кількості областей;
Виведення площі;
Виведення обласних центрів.
У звіті аргументувати використання кожного з методів у відповідних класах, з огляду на поставлене завдання. Якщо окремі класи або окремі перевизначені методи класу Object не відповідають завданню і їх використання є недоцільним, зазначити це у звіті.
Виконання роботи: Створюємо консольний додаток, та створюємо необхідні класи.
/
Завдання 1:
Створюємо класи «Text» та «Paragraph»:
Клас «Text»:
package lr6;import java.util.ArrayList;import java.util.Scanner;public class Text { String title; ArrayList<Paragraph> paragraphs; public Text(String title, ArrayList<Paragraph> paragraph) { this.title = title; this.paragraphs = paragraph; } public void getParagraphs() { StringBuilder text = new StringBuilder(); for (Paragraph paragraph : paragraphs) { text.append(paragraph.text).append("\n\n"); } System.out.println(text); } public void addParagraph() { Scanner sc = new Scanner(System.in); String paragraphString = sc.nextLine(); Paragraph newParagraph = new Paragraph(paragraphString); for (Paragraph paragraph : paragraphs) { if (paragraph.equals(newParagraph)) { System.out.println("This paragraph is already in the text!\n"); return; } } System.out.println("\n"); paragraphs.add(newParagraph); } public void getTitle() { System.out.printf("\t << %s >> \n\n", this.title); } @Override public String toString() { StringBuilder text = new StringBuilder(); for (Paragraph paragraph : paragraphs) { text.append(paragraph.text).append("\n\n"); } return String.format("\t << %s >> \n\n%s", this.title, text); }}
У класі «Text» перевизначено метод toString(), щоб можна було вивести об’єкт цього класу одною командою у консоль :
Text ukraineArticle = new Text("Ukraine", paragraphs);System.out.println(ukraineArticle);
Клас «Paragraph»:
package lr6;public class Paragraph { String text; public Paragraph(String text) { this.text = text; } @Override public boolean equals(Object obj) { if (this == obj) return true; Paragraph paragraph = (Paragraph) obj; return this.text.equals(paragraph.text); } @Override public String toString() { return text; } @Override public int hashCode() { return text.hashCode(); }}
У класі «Paragraph» перевизначено методи equals(), hashCode(), щоб можна було коректно порівняти екземпляри цього класу під час додавання до масиву параграфів, уникаючи дубляж тексту.
Якщо ми перевизначаємо методи equals() то ми повинні і перевизначити метод hashCode(), тому що hashCode() повертає ціле число, яке представляє поточний екземпляр класу. Може виникнути така ситуація коли екземпляри класу будуть мати однакові поля, але будуть повертати різні хеш-коди.
Код «Main»:
package lr6;import java.util.ArrayList;import java.util.Arrays;public class Main { public static void main(String[] args) { // Task 1 ArrayList<Paragraph> paragraphs = new ArrayList<Paragraph>(); paragraphs.add(new Paragraph("Ukraine is a country in Eastern Europe.")); paragraphs.add(new Paragraph("Ukraine covers approximately 600,000 square kilometres.")); Text ukraineArticle = new Text("Ukraine", paragraphs); System.out.println(ukraineArticle); System.out.print("Print what you now about Ukraine:"); ukraineArticle.addParagraph(); System.out.print("Now the text looks like this: \n"); ukraineArticle.getTitle(); ukraineArticle.getParagraphs(); }}
Результат роботи Завдання№1:
/
Завдання 1:
Створюємо класи «Ukraine» та «Region»:
Клас «Ukraine»:
package lr6;public class Ukraine { Region[] regions; Ukraine(Region[] regions) { this.regions = regions; } public void printArea() { double totalArea = 0; for (Region region : this.regions) { totalArea += region.area; } System.out.printf("\nTotal area of Ukraine : %.2f (km²)", totalArea); } public void printRegions() { System.out.println("======================== Regions of Ukraine ========================\n" + " Name: Capital: Area:"); for (Region region : this.regions) { System.out.println(region); } printMotto(); } public void printRegionNumber() { System.out.printf("\nNumber of regions in Ukraine : %d", regions.length); } public void printCapital() { System.out.println("======================== Capital of Ukraine ========================\n" + " Name: Capital: Area:"); for (Region region : this.regions) { if (region.isCapital != null && region.isCapital) { System.out.println(region); } } printMotto(); } public void printMotto() { System.out.println("\n\t\uD83C\uDDFA\uD83C\uDDE6 Glory to Ukraine! \uD83C\uDDFA\uD83C\uDDE6\n"); }}
У класі «Ukraine» не перевизнаачено методи equals(), hashCode() , бо навряд чи прийдеться порівнювати 2 різні України, так як Україна є одною такою.
Також не перевзиначено метод toString(), бо для виводу відповідних даних та значень виконується за допомогою інших команд.
Клас «Region»:
package lr6;public class Region { String name; String capital; Boolean isSpecialStatus; Boolean isCapital; double area; Region(String name, String capital, double area) { this.name = name; this.capital = capital; this.area = area; } Region(String name, double area, boolean isSpecialStatus, boolean isCapital) { this.name = name; this.capital = name; this.area = area; this.isSpecialStatus = isSpecialStatus; this.isCapital = isCapital; } @Override public String toString() { return String.format(" %-32s %-18s %-10.2f %s", this.name, isSpecialStatus != null ? "--------" : this.capital, this.area, isSpecialStatus != null ? "(City with special status)" : ""); }}
У класі «Region» перевизначено метод toString(), щоб можна було вивести об’єкт цього класу одною командою у консоль :
System.out.println(region);
Це використовується під час виведеня всіх регіонів у класі «Ukraine».
Порівнювати між собою регіони за назвою, адміністративним центром та площею не є доцільно. Кожний регіон є унікальним і не може повторюватись, виходячи з цього недоцільно перевизначати методи equals(), hashCode() для цієї предметної області.
Код «Main»:
package lr6;import java.util.ArrayList;import java.util.Arrays;public class Main { public static void main(String[] args) { // Task 2 Region[] regions = new Region[]{ new Region("Autonomous Republic of Crimea", "Simferopol", 26081), new Region("Vinnytsia oblast", "Vinnytsia", 26513), new Region("Volyn oblast", "Lutsk", 20144), new Region("Dnipropetrovsk oblast", "Dnipro", 31974), new Region("Donetsk oblast", "Donetsk", 26517), new Region("Zhytomyr oblast", "Zhytomyr", 29832), new Region("Zakarpattia oblast", "Uzhhorod", 12777), new Region("Zaporizhzhia oblast", "Zaporizhzhia", 27180), new Region("Ivano-Frankivsk oblast", "Ivano-Frankivsk", 13928), new Region("Kyiv oblast", "Kyiv", 28131), new Region("Kirovohrad oblast", "Kropyvnytskyi", 24588), new Region("Luhansk oblast", "Luhansk", 26684), new Region("Lviv oblast", "Lviv", 21833), new Region("Mykolaiv oblast", "Mykolaiv", 24598), new Region("Odesa oblast", "Odesa", 33310), new Region("Poltava oblast", "Poltava", 28748), new Region("Rivne oblast", "Rivne", 20047), new Region("Sumy oblast", "Sumy", 23834), new Region("Ternopil oblast", "Ternopil", 13823), new Region("Kharkiv oblast", "Kharkiv", 31415), new Region("Kherson oblast", "Kherson", 28461), new Region("Khmelnytskyi oblast", "Khmelnytskyi", 20645), new Region("Cherkasy oblast", "Cherkasy", 20900), new Region("Chernivtsi oblast", "Chernivtsi", 8097), new Region("Chernihiv oblast", "Chernihiv", 31865), new Region("Kyiv", 839, true, true), new Region("Sevastopol", 864, true, false), }; Ukraine ukraine = new Ukraine(regions); ukraine.printRegions(); ukraine.printCapital(); ukraine.printArea(); ukraine.printRegionNumber(); }}
Результати:
/
Висновок: Під час виконання лабораторної роботи, було набуто навички з розробки консольної додатку та перевизначення методів класу Object.