ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ:
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° | |
---|---|
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. ΠΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΏΠΎΠΊΠ° Π½ΠΈΡΠ΅ΠΌ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ, ΠΊΡΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΡΡΠΎ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π°ΠΌ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ
ΠΠ»Π°ΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°
public String helloMessage() {
return "Hello!";
}
ΠΠΎΠ»Ρ-ΠΊΠΎΡΠΊΠ°
public String helloMessage() {
return "Nyan nyan nyan ni hao nyan!";
}
ΠΠΎΠ»Ρ-Π΅Π½ΠΎΡ (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΎΠ±ΠΎΡΠΎΡΠ½ΠΈ)
@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-ΡΠ°ΠΉΠ» Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ°Ρ :
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 ΠΈ Π΄Π°Π»ΡΡΠ΅ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡ ΠΎΠ± Π΅Π³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅.
ΠΠΎ Π·Π°Π΄Π°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ 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().
ΠΠ°Π»Π΅Π΅, Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° 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, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΡΡ Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°:
public String getName(){
return name;
}
public CollectionAction getAction(String context){
return action;
}
ΠΠΈΡΡΠΈΠ½Π³ CollectionAction:
@FunctionalInterface
public interface CollectionAction {
void action(PersonArray col);
}
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° getName - ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ±ΠΎΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΄Π΅ΡΠΈΡΡΠ°ΡΠΎΡΠΎΠΌ.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ getAction, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ :
@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
@Override
public CollectionAction getAction(String context) {
return col -> col.forEach(System.out::println);
}