Skip to content

AppLoidx/itmo-labwork

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ITMO Laboratory work

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
gson Для сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² JSON
org.everit.json.schema Для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… JSON-Π΄Π°Π½Π½Ρ‹Ρ…

Зависимости Π² pom.xml:

    <dependencies>
        <!--FOR JSON VALIDATION-->
        <dependency>
            <groupId>org.everit.json</groupId>
            <artifactId>org.everit.json.schema</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!--JSON PARSER-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
    </dependencies>

Π—Π°Π΄Π°Π½ΠΈΠ΅ 5 ΠΏΠΎ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅:

Разработанная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ трСбованиям:
Класс, ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ экзСмпляров ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ управляСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ сортировку ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
Для хранСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° java.util.ArrayDequeue.
ΠŸΡ€ΠΈ запускС прилоТСния коллСкция Π΄ΠΎΠ»ΠΆΠ½Π° автоматичСски Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ значСниями ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.
Имя Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния.
Π”Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ»Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ csv.
ΠŸΡ€ΠΈ остановкС прилоТСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ автоматичСски ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ».
Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса java.io.BufferedReader.
Π—Π°ΠΏΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса java.io.BufferedWriter.
ВсС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (см. Π½ΠΈΠΆΠ΅) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ javadoc.
Π€ΠΎΡ€ΠΌΠ°Ρ‚ задания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… - json.

Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

  • remove_last: ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ послСдний элСмСнт ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ
  • remove {element}: ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ
  • info: вывСсти Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ (Ρ‚ΠΈΠΏ, Π΄Π°Ρ‚Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, количСство элСмСнтов ΠΈ Ρ‚.Π΄.)
  • add {element}: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ
  • add_if_max {element}: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, Ссли Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ наибольшСго элСмСнта этой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ
  • show: вывСсти Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° всС элСмСнты ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² строковом прСдставлСнии
  • add_if_min {element}: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, Ссли Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСньшС, Ρ‡Π΅ΠΌ Ρƒ наимСньшСго элСмСнта этой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ

Бущности ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ

Для добавлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ нСсколько Ρ‚ΠΈΠΏΠΎΠ², наслСдованныС ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ класса Person.

Класс Person - это абстрактный класс дял всСх сущностСй ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ.

Π’ Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ equals ΠΈ hashcode:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return height == person.height &&
                name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(height, name);
    }

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· листинга, класс ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΠ΅ поля:

  • name - имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
  • height - высота ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ элСмСнты Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΈΡ… росту:

public int compareTo(Person o) {
        return o.height - height;
    }

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ сущности

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ рСализациям класса Person. ВсС классы ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ привСтствСнного сообщСния, Π½ΠΎ это понадобится Π½Π°ΠΌ Π² Π±ΡƒΠ΄ΡƒΡˆΠ΅ΠΌ

Human

Класс Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°

public String helloMessage() {
        return "Hello!";
    }

Neko

ΠŸΠΎΠ»Ρƒ-кошка

public String helloMessage() {
        return "Nyan nyan nyan ni hao nyan!";
    }

Tanuki

ΠŸΠΎΠ»Ρƒ-Π΅Π½ΠΎΡ‚ (Π½Π° самом Π΄Π΅Π»Π΅, ΠΎΠ±ΠΎΡ€ΠΎΡ‚Π½ΠΈ)

@Override
    public String helloMessage() {
        return "Hey, hello!";
    }

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² csv (Comma-Separated Values), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚Ρƒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ структуры, ΠΊΡ€ΠΎΠΌΠ΅ запятых, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‘ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:

Human, 170, img/res/assets/img1.png, img/res/assets/img2.png, Cyle

Π’Π°ΠΊΠΎΠΉ Π²ΠΈΠ΄ ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌ:

class=Neko, name=China, height=140, imgSource=assets/china.png, playable=nyan.mp4

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎ позволяСт Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π°. Но ΠΎΠ½ Ρ…ΠΎΡ€ΠΎΡˆ, Ссли с этим Ρ„Π°ΠΉΠ»ΠΎΠΌ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ оговорСнная структура.

Но Π΄Π°ΠΆΠ΅, Ссли это Ρ‚Π°ΠΊ, Ρ‚ΠΎ это ΠΎΡ‡Π΅Π½ΡŒ сильно Π±ΡŒΠ΅Ρ‚ ΠΏΠΎ адаптивности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΌΡ‹ Π½Π΅ смоТСм ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±Π΅Π·, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΠΎΠ»ΡŒΡˆΠΈΡ… усилий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠΌ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡŒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ позволяСт Π½Π΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΆΠ΅ΡΡ‚ΠΊΡƒΡŽ структуру ΠΈ ΠΎΠ½ понятСн Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ. Π Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ парсСр.

ΠŸΠ°Ρ€ΡΠ΅Ρ€ называСтся CSVExpressionReader (я Π½Π΅ Π΄ΠΎΠ»Π³ΠΎ Π΄ΡƒΠΌΠ°Π» Π½Π°Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ) ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ readString для получСния значСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ поля:

class CSVExpressionReader {
    static String readString(String field, String data){

        // Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€ .+?
        String regex = ",*?[ ]*" + field + "=.*?(,+|$)";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(data);
        if (m.find()) return m.group().split("=")[1].replace(",", "");

        return null;

    }
}

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€Ρ‹

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€Ρ‹?

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ мСтасимволы *, . ΠΈ + ΠΆΠ°Π΄Π½Ρ‹, Ρ‚.Π΅. ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ максимально, Π° Π½Π΅ минимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ совпадСниС. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ совпадСния ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда начинаСтся Π½Π΅ с Π½Π°Ρ‡Π°Π»Π°, Π° с ΠΊΠΎΠ½Ρ†Π° тСкста ΠΈ продолТаСтся Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° совпадСниС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим строку:

This offer is not available to customers living in <b>AK</b> and <b>HI</b>. 

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

<[Bb]>.*</[Bb]>

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ: <b>AK</b> and <b>HI</b>

Π₯отя ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… выраТСния Π² Ρ‚Π΅Π³Π°Ρ….

И Ρ‡Ρ‚ΠΎ Ссли ΠΆΠ°Π΄Π½ΠΎΠ΅ совпадСниС Π½Π΅ трСбуСтся? Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌΠΈ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Она Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ совпадСниС с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π° Π½Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством символов.

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ с присоСдиняСмым ΠΊ Π½ΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌ ?. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€Π° имССтся свой Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ эквивалСнт:

Π–Π°Π΄Π½Ρ‹ΠΉ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€ Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΊΠ²Π°Π½Ρ‚ΠΎΡ€
* *?
+ +?
{n,} {n,}?

Π’Π°ΠΊ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°:

<[Bb]>.*?</[Bb]>

И ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π²Π° совпадСния: <b>AK</b> ΠΈ <b>HI</b>

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ пСрсонаТСй ΠΈΠ· csv Ρ„Π°ΠΉΠ»Π°

Π£ нас Π΅ΡΡ‚ΡŒ csv-Ρ„Π°ΠΉΠ» с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ пСрсонаТах:

class=Neko, name=China, height=140, imgSource=assets/china.png, playable=nyan.mp4
class=Neko, name=Hanekawa, height=180, imgSource=assets/hanekawa.png
class=Human, name=Lilly, height=150, imgSource=assets/trombosit.png
class=Tanuki, name=Raphtalia, height=170, imgSource=assets/raphtalia.png

Для этой Ρ†Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс Parser ΠΈ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ readPerson(String line), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считываСт пСрсонаТа ΠΈΠ· строки:

    private static Person readPerson(String line){

        int height = 0;

        String classOf      = CSVExpressionReader.readString("class", line);
        String name         = CSVExpressionReader.readString("name", line);
        String imgSource    = CSVExpressionReader.readString("imgSource", line);
        String temp         = CSVExpressionReader.readString("height", line);
        String playable     = CSVExpressionReader.readString("playable", line);

        if (temp!=null && temp.matches("[0-9]+")){
            height = Integer.parseInt(temp);
        }
        if (classOf==null || name==null) return null;

        Person p;
        if ((p=PersonFabric.getPerson(classOf, name, height))==null) return null;

        p.setSpritePath(imgSource); // image path
        p.setPlayRes(playable);     // video resource path

        return p;
    }

Если ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ поля ΠΈΠ»ΠΈ, Ссли ΠΎΠ½ΠΈ Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Ρ‹, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ null, говоря, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ пСрсонаТа.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ строку - ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ вСсь csv Ρ„Π°ΠΉΠ»:

    public static List<Person> readPersons(File file) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        List<Person> persons = new ArrayList<>();
        while((line=br.readLine())!=null){
            Person person = readPerson(line);
            if (person!=null) persons.add(person);
        }

        return persons;

    }

Углубимся Π² создании пСрсонаТСй (ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Абстрактная Ρ„Π°Π±Ρ€ΠΈΠΊΠ°)

Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‚ΠΎ ΠΏΡ€ΠΈ считвании пСрсонаТа использовался ΠΌΠ΅Ρ‚ΠΎΠ΄ PersonFabric.getPerson(classOf, name, height).

Π•Π³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ классов, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ асбтрактный (Π΅Π΄ΠΈΠ½Ρ‹ΠΉ) класс.

Π˜Π½Ρ‹ΠΌΠΈ словами, Π²Π½ΡƒΡ‚Ρ€ΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Human ΠΈΠ»ΠΈ Neko, Π½ΠΎ сам ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Person, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, лишь Π±Ρ‹ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ Person.

Для этого, Π΅ΠΌΡƒ пСрСдаСтся строковоС имя класса : classOf
Имя ΠΈ рост: name, height

Π‘Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ:

public class PersonFabric {

    public static Person getPerson(String classOf, String name, int height){

        for (PersonClass p: PersonClass.values()){

            if (p.toString().equals(classOf.toUpperCase())){
                return p.getInstance(name, height);
            }
        }
        return null;
    }
}

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ благодаря enum'Ρƒ PersonClass, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getInstance:

public enum PersonClass {

    HUMAN{
        @Override
        public Person getInstance(String name, int height) {
            return new Human(name, height);
        }
    },

    NEKO {
        @Override
        public Person getInstance(String name, int height) {
            return new Neko(name, height);
        }
    },

    TANUKI {
        @Override
        public Person getInstance(String name, int height) {
            return new Tanuki(name, height);
        }
    };

    public abstract Person getInstance(String name, int height);
}

БСйчас Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ это послуТит Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉ ΠΈΠ·-Π·Π° гибкости, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° Π½Π°ΠΌ Π΄Π°Π΅Ρ‚. НапримСр, Ссли Π΄ΠΎΠΏΡƒΡΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ классы с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ полями (сСйчас Ρƒ всСх Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² конструкторах), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ getPerson, Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ map ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ элСмСнтов.

Π”Π°Π»Π΅Π΅, ΠΌΡ‹ смоТСм ΠΎΠΏΠ΅Ρ€Π΄Π΅Π»ΠΈΡ‚ΡŒ созданиС класса Π² enum ΠΈ дальшС Π½Π΅ бСспокоится ΠΎΠ± Π΅Π³ΠΎ экзСмплярС.

PersonArray - коллСкция ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Person

По заданию Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ArrayDeque, поэтому я создал класс PersonArray, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСтся ΠΎΡ‚ ArrayDeque:

public class PersonArray extends ArrayDeque<Person> {
    private String changedDate;
    {
        changedDate = SimpleDateFormat.getDateTimeInstance().format(new Date());
    }

    public String getChangedDate() {
        return changedDate;
    }

    public void setChangedDate(){
        this.changedDate = SimpleDateFormat.getDateTimeInstance().format(new Date());
    }

    public void sort(){
        PersonArray deque = new PersonArray();
        List<Person> temp = this.stream().sorted().collect(Collectors.toList());
        this.clear();
        this.addAll(temp);
    }

    public void saveTo(File file) throws IOException {
        // Ρ‚ΡƒΡ‚ Π±Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ нСпонятного
    }

    private void writeToFile(File file) throws IOException {
        // здСсь много кода...
    }

    @Override
    public int hashCode() {
        int c = 0;
        for (Person p : this){
            c = c*31 + p.hashCode();
        }
        return c;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof PersonArray){
            List<Person> aObj = new ArrayList<>(((PersonArray) obj));
            List<Person> thisObj = new ArrayList<>(this);
            Collections.sort(aObj);
            Collections.sort(thisObj);

            if (aObj.size() == thisObj.size()){
                for (int i = 0; i < aObj.size() - 1; i++){
                    if (!aObj.get(i).equals(thisObj.get(i))){
                        return false;
                    }
                }
                return true;
            }
            return false;
        }
        return false;
    }
}

Π‘Π½Π°Ρ‡Π°Π»Π°, рассмотрим ΠΏΠΎΠ»Π΅ changedDate ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ setChangedDate.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ врСмя послСднСго измСнСния ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ нСобходимости, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° Π΄Π°Ρ‚Ρƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Если происходит ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ρ‚ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ setChangedDate().

hashcode & equals

Π”Π°Π»Π΅Π΅, с соблюдСниСм ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° equals происходит ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Для Ρ…ΡΡˆ-ΠΊΠΎΠ΄Π° - Π²Ρ‹ΡΡ‡ΠΈΡ‚Π²Π°ΡŽΡ‚ΡΡ Ρ…ΡΡˆ-ΠΊΠΎΠ΄Ρ‹ всСх Π΅Π³ΠΎ элСмСнтов, Π° для equals ΠΎΠ±Π° PersonArray ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сравниваСтся с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ нСльзя Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ?

@Override
public boolean equals(Object obj) {
    return obj.hashCode() == this.hashCode();
}

Π­Ρ‚ΠΎ Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ понятиС ΠΊΠ°ΠΊ коллизия, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…ΡΡˆ-ΠΊΠΎΠ΄. Π’ΠΎΠ³Π΄Π°, наш ΠΌΠ΅Ρ‚ΠΎΠ΄ equals Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π΄Π°ΠΆΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ класс Dog ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ эквивалСнтСн Π½Π°ΡˆΠ΅ΠΌΡƒ PersonArray, Ρ‡Ρ‚ΠΎ просто нСмыслимо.

МоТно просто ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ equals:

  • Π’ΠΎ врСмя выполнСния прилоТСния ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode Π΄ΠΎΠ»ΠΆΠ΅Π½ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ никакая информация, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΡ€ΠΈ сравнСнии этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ equals, Π½Π΅ измСнилась. Однако Π½Π΅ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прилоТСния.
  • Если Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€Π°Π²Π½Ρ‹ согласно Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ equals (Object), Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° hashCode Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ цСлочислСнныС значСния.
  • Если ΠΌΠ΅Ρ‚ΠΎΠ΄ equals (Object) ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ Ρ€Π°Π²Π½Ρ‹ ΠΎΠ΄ΠΈΠ½ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ для Π½ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Π΅ числа. Однако программист Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ гСнСрация Ρ€Π°Π·Π½Ρ‹Ρ… чисСл для Π½Π΅Ρ€Π°Π²Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ эту Ρ‚Π΅ΠΌΡƒ: https://vk.com/@apploidxxx-equals-hash-code-to-string

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ мноТСство лямбда Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ :)

КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° являСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, управляСмый ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Π² Π²ΠΈΠ΄Π΅ класса CommandContainer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт мноТСством этих ΠΊΠΎΠΌΠ°Π½Π΄.

Command

ВсС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ являСтся субклассами Command, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π° основных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

    public String getName(){
        return name;
    }

    public CollectionAction getAction(String context){
        return action;
    }

Листинг CollectionAction:

@FunctionalInterface
public interface CollectionAction {
    void action(PersonArray col);
}

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getName - происходит Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΄Π΅ΡˆΠΈΡ„Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ getAction, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс для взаимодСйствия с ΠΊΠΎΠ»Π»Π΅ΠΊΡ†Ρ‚Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ…:

Add-If-Max

    @Override
    public CollectionAction getAction(String context) {
        String json = JSONContextReader.readJSONContext(context);

        try {
            JSONPersonParser.validate(new JSONObject(json));
            Person person = JSONPersonParser.getPerson(json);

            return col -> {
                if (person == null) {
                    System.err.println("ΠŸΠ΅Ρ€ΡΠΎΠ½Π°ΠΆ с Ρ‚Π°ΠΊΠΈΠΌ классом Π½Π΅ сущСствуСт. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Π²Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….");
                } else {
                    Optional<Person> maxPerson = col.stream().max(Comparator.comparing(Person::getHeight));
                    if (!maxPerson.isPresent()) CollectionEditor.addPerson(col, person);
                    else if (maxPerson.get().getHeight() < person.getHeight()) {
                        CollectionEditor.addPerson(col, person);
                    }
                }
            };
        } // exceptions catch here ...
    }

Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ, Ρ‚ΠΎ Π²Ρ‹ΠΆΠ½Ρ‹ΠΌ здСсь являСтся Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°:

Optional<Person> maxPerson = col.stream().max(Comparator.comparing(Person::getHeight));

if (!maxPerson.isPresent()) 
    CollectionEditor.addPerson(col, person);
else if (maxPerson.get().getHeight() < person.getHeight())
    CollectionEditor.addPerson(col, person);

И само лямбда Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ этот Π±Π»ΠΎΠΊ:

 return col -> { /*  ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ дСйствия...*/ };

Π³Π΄Π΅ col - это коллСкция Π½Π°ΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ PersonArray

Show

@Override
public CollectionAction getAction(String context) {
    return col -> col.forEach(System.out::println);
}

About

ITMO Laboratory work

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages