chore: organize homework into first-part directory
@@ -0,0 +1,61 @@
|
||||
# Emacs/vim
|
||||
|
||||
*~
|
||||
*.swp
|
||||
|
||||
# VSCode
|
||||
|
||||
.vscode
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
|
||||
|
||||
# MacOS
|
||||
|
||||
.DS_Store
|
||||
|
||||
# CS56 specific: Secrets files
|
||||
|
||||
localhost.json
|
||||
heroku.json
|
||||
|
||||
# Maven (from: https://github.com/github/gitignore/blob/master/Maven.gitignore)
|
||||
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
# Java (from: https://github.com/github/gitignore/blob/master/Java.gitignore)
|
||||
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
@@ -0,0 +1,29 @@
|
||||
# Homework 02
|
||||
|
||||
1. Создать класс Student, обязательное поле класса Student - List<Book> (минимум по 5 книг у каждого)
|
||||
|
||||
2. Создать текстовый файл со студентами и книгами
|
||||
|
||||
3. При помощи внутренних фреймворков и библиотек для ввода-вывода информации в Java считать содержимое файла и заполнить List<Student> этими данными (Должен быть реализован механизм заполнения коллекции студентов из текстового файла)
|
||||
|
||||
4. При помощи одного (не допускается объявления никаких промежуточных переменных, совсем никаких) стрима:
|
||||
|
||||
Вывести в консоль каждого студента (переопределите toString)
|
||||
|
||||
Получить для каждого студента список книг
|
||||
|
||||
Получить книги
|
||||
|
||||
Отсортировать книги по количеству страниц (Не забывайте про условия для сравнения объектов)
|
||||
|
||||
Оставить только уникальные книги
|
||||
|
||||
Отфильтровать книги, оставив только те, которые были выпущены после 2000 года
|
||||
|
||||
Ограничить стрим на 3 элементах
|
||||
|
||||
Получить из книг годы выпуска
|
||||
|
||||
При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть Optional от года
|
||||
|
||||
При помощи методов получения значения из Optional вывести в консоль год выпуска найденной книги, либо запись о том, что такая книга отсутствует
|
||||
@@ -0,0 +1 @@
|
||||
xargs img2pdf -o result.pdf < order.txt
|
||||
@@ -0,0 +1,10 @@
|
||||
Book{author='Ggg Ggg', title='Book Ggg', publishYear=2005, pageCount=100}
|
||||
Book{author='Bbb Bbb', title='Book Bbb', publishYear=2018, pageCount=200}
|
||||
Book{author='Ddd Ddd', title='Book Ddd', publishYear=2015, pageCount=400}
|
||||
Book{author='Aaa Aaa', title='Book Aaa', publishYear=2027, pageCount=500}
|
||||
Book{author='Iii Iii', title='Book Iii', publishYear=2012, pageCount=600}
|
||||
Book{author='Hhh Hhh', title='Book Hhh', publishYear=2021, pageCount=800}
|
||||
Book{author='Ccc Ccc', title='Book Ccc', publishYear=2024, pageCount=900}
|
||||
Book{author='Jjj Jjj', title='Book Jjj', publishYear=2001, pageCount=1000}
|
||||
Book{author='Lll Lll', title='Book Lll', publishYear=2025, pageCount=1100}
|
||||
Book{author='Fff Fff', title='Book Fff', publishYear=2030, pageCount=1200}
|
||||
@@ -0,0 +1,48 @@
|
||||
❮ mvn exec:java -Dexec.mainClass="com.example.App" > output.txt
|
||||
|
||||
[INFO] Scanning for projects...
|
||||
[INFO]
|
||||
[INFO] ---------------------< com.example:student-reader >---------------------
|
||||
[INFO] Building student-reader 1.0-SNAPSHOT
|
||||
[INFO] from pom.xml
|
||||
[INFO] --------------------------------[ jar ]---------------------------------
|
||||
[INFO]
|
||||
[INFO] --- exec:3.6.3:java (default-cli) @ student-reader ---
|
||||
Student{
|
||||
name='Aaa'
|
||||
surname='Bbb'
|
||||
books=
|
||||
Book{author='Aaa Aaa', title='Book Aaa', publishYear=2027, pageCount=500}
|
||||
Book{author='Bbb Bbb', title='Book Bbb', publishYear=2018, pageCount=200}
|
||||
Book{author='Ccc Ccc', title='Book Ccc', publishYear=2024, pageCount=900}
|
||||
Book{author='Ddd Ddd', title='Book Ddd', publishYear=2015, pageCount=400}
|
||||
Book{author='Ddd Ddd', title='Book Ddd', publishYear=2015, pageCount=400}
|
||||
}
|
||||
Student{
|
||||
name='Ccc'
|
||||
surname='Ddd'
|
||||
books=
|
||||
Book{author='Eee Eee', title='Book Eee', publishYear=1999, pageCount=300}
|
||||
Book{author='Fff Fff', title='Book Fff', publishYear=2030, pageCount=1200}
|
||||
Book{author='Ggg Ggg', title='Book Ggg', publishYear=2005, pageCount=100}
|
||||
Book{author='Hhh Hhh', title='Book Hhh', publishYear=2021, pageCount=800}
|
||||
Book{author='Iii Iii', title='Book Iii', publishYear=2012, pageCount=600}
|
||||
}
|
||||
Student{
|
||||
name='Eee'
|
||||
surname='Fff'
|
||||
books=
|
||||
Book{author='Aaa Aaa', title='Book Aaa', publishYear=2027, pageCount=500}
|
||||
Book{author='Bbb Bbb', title='Book Bbb', publishYear=2018, pageCount=200}
|
||||
Book{author='Jjj Jjj', title='Book Jjj', publishYear=2001, pageCount=1000}
|
||||
Book{author='Kkk Kkk', title='Book Kkk', publishYear=1995, pageCount=700}
|
||||
Book{author='Lll Lll', title='Book Lll', publishYear=2025, pageCount=1100}
|
||||
}
|
||||
Год выпуска: 2005
|
||||
Выполнение программы завершено
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO] BUILD SUCCESS
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO] Total time: 1.025 s
|
||||
[INFO] Finished at: 2026-08-06T23:30:03+04:00
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
@@ -0,0 +1,7 @@
|
||||
"screenshots/Screenshot from 2026-08-06 23-28-36.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-29-11.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-29-31.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-52-39.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-35-03.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-26-45.png"
|
||||
"screenshots/Screenshot from 2026-08-06 23-31-03.png"
|
||||
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 206 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 207 KiB |
|
After Width: | Height: | Size: 256 KiB |
@@ -0,0 +1,39 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>student-reader</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>student-reader</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.20.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.20.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.example;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.time.Year;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
public class App {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
try {
|
||||
|
||||
Path studentsJsonFile = Path.of("students.json");
|
||||
List<Student> students = StudentReader.read(studentsJsonFile);
|
||||
|
||||
// Условие использования одного stream сохраняется
|
||||
students.stream()
|
||||
|
||||
// Вывести в консоль каждого студента (переопределите toString)
|
||||
.peek(System.out::println)
|
||||
|
||||
// Получить для каждого студента список книг
|
||||
.map(s -> s.getBooks()) // Stream<List<Book>>
|
||||
|
||||
// Получить книги
|
||||
.flatMap(List::stream) // Stream<Book>;
|
||||
|
||||
// Oтсортировать книги по количеству страниц (Не забывайте про условия для сравнения
|
||||
// объектов)
|
||||
.sorted(Comparator.comparingInt(Book::getPageCount))
|
||||
|
||||
// Оставить только уникальные книги
|
||||
.distinct()
|
||||
|
||||
// Отфильтровать книги, оставив только те, которые были выпущены после 2000 года
|
||||
.filter(b -> b.getPublishYear().isAfter(Year.of(2000)))
|
||||
|
||||
// Ограничить стрим на 3 элементах
|
||||
.limit(3)
|
||||
|
||||
// Получить из книг годы выпуска
|
||||
.map(Book::getPublishYear)
|
||||
|
||||
// При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть
|
||||
// Optional от года
|
||||
.findFirst()
|
||||
|
||||
// При помощи методов получения значения из Optional вывести в консоль год выпуска
|
||||
// найденной книги, либо запись о том, что такая книга отсутствует
|
||||
.ifPresentOrElse(
|
||||
year -> System.out.println("Год выпуска: " + year),
|
||||
() -> System.out.println("Подходящая книга отсутствует"));
|
||||
|
||||
} catch (IOException e) {
|
||||
|
||||
System.err.println("Сударь, вы передали неправильный файл!");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
System.err.println("Ну тут мои полномочии всё!");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
System.out.println("Выполнение программы завершено");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.example;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.time.Year;
|
||||
import java.util.Objects;
|
||||
|
||||
public class Book {
|
||||
|
||||
@JsonCreator
|
||||
public Book(
|
||||
@JsonProperty("author") String author,
|
||||
@JsonProperty("title") String title,
|
||||
@JsonProperty("publishYear") Year publishYear,
|
||||
@JsonProperty("pageCount") int pageCount) {
|
||||
|
||||
this.author = author;
|
||||
this.title = title;
|
||||
this.publishYear = publishYear;
|
||||
this.pageCount = pageCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(o instanceof Book book)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return pageCount == book.pageCount
|
||||
&& author.equals(book.author)
|
||||
&& title.equals(book.title)
|
||||
&& publishYear.equals(book.publishYear);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(author, title, publishYear, pageCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Book{"
|
||||
+ "author='"
|
||||
+ author
|
||||
+ '\''
|
||||
+ ", title='"
|
||||
+ title
|
||||
+ '\''
|
||||
+ ", publishYear="
|
||||
+ publishYear
|
||||
+ ", pageCount="
|
||||
+ pageCount
|
||||
+ '}';
|
||||
}
|
||||
|
||||
public int getPageCount() {
|
||||
return pageCount;
|
||||
}
|
||||
|
||||
public Year getPublishYear() {
|
||||
return publishYear;
|
||||
}
|
||||
|
||||
private final String author;
|
||||
private final String title;
|
||||
private final Year publishYear;
|
||||
private final int pageCount;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.example;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.util.List;
|
||||
|
||||
public class Student {
|
||||
|
||||
@JsonCreator
|
||||
public Student(
|
||||
@JsonProperty("name") String name,
|
||||
@JsonProperty("surname") String surname,
|
||||
@JsonProperty("books") List<Book> books) {
|
||||
|
||||
this.name = name;
|
||||
this.surname = surname;
|
||||
this.books = List.copyOf(books);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder booksString = new StringBuilder();
|
||||
|
||||
for (Book book : books) {
|
||||
booksString.append("\n ").append(book);
|
||||
}
|
||||
|
||||
return "Student{\n"
|
||||
+ " name='"
|
||||
+ name
|
||||
+ "'\n"
|
||||
+ " surname='"
|
||||
+ surname
|
||||
+ "'\n"
|
||||
+ " books="
|
||||
+ booksString
|
||||
+ "\n}";
|
||||
}
|
||||
|
||||
public List<Book> getBooks() {
|
||||
return books;
|
||||
}
|
||||
|
||||
private final String name;
|
||||
private final String surname;
|
||||
private final List<Book> books;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.example;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
public final class StudentReader {
|
||||
|
||||
public static List<Student> read(Path path) throws IOException {
|
||||
return MAPPER.readValue(path.toFile(), new TypeReference<List<Student>>() {});
|
||||
}
|
||||
|
||||
private StudentReader() {}
|
||||
|
||||
private static final ObjectMapper MAPPER =
|
||||
new ObjectMapper().registerModule(new JavaTimeModule());
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
[
|
||||
{
|
||||
"name": "Aaa",
|
||||
"surname": "Bbb",
|
||||
"books": [
|
||||
{
|
||||
"author": "Aaa Aaa",
|
||||
"title": "Book Aaa",
|
||||
"publishYear": "2027",
|
||||
"pageCount": 500
|
||||
},
|
||||
{
|
||||
"author": "Bbb Bbb",
|
||||
"title": "Book Bbb",
|
||||
"publishYear": "2018",
|
||||
"pageCount": 200
|
||||
},
|
||||
{
|
||||
"author": "Ccc Ccc",
|
||||
"title": "Book Ccc",
|
||||
"publishYear": "2024",
|
||||
"pageCount": 900
|
||||
},
|
||||
{
|
||||
"author": "Ddd Ddd",
|
||||
"title": "Book Ddd",
|
||||
"publishYear": "2015",
|
||||
"pageCount": 400
|
||||
},
|
||||
{
|
||||
"author": "Ddd Ddd",
|
||||
"title": "Book Ddd",
|
||||
"publishYear": "2015",
|
||||
"pageCount": 400
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Ccc",
|
||||
"surname": "Ddd",
|
||||
"books": [
|
||||
{
|
||||
"author": "Eee Eee",
|
||||
"title": "Book Eee",
|
||||
"publishYear": "1999",
|
||||
"pageCount": 300
|
||||
},
|
||||
{
|
||||
"author": "Fff Fff",
|
||||
"title": "Book Fff",
|
||||
"publishYear": "2030",
|
||||
"pageCount": 1200
|
||||
},
|
||||
{
|
||||
"author": "Ggg Ggg",
|
||||
"title": "Book Ggg",
|
||||
"publishYear": "2005",
|
||||
"pageCount": 100
|
||||
},
|
||||
{
|
||||
"author": "Hhh Hhh",
|
||||
"title": "Book Hhh",
|
||||
"publishYear": "2021",
|
||||
"pageCount": 800
|
||||
},
|
||||
{
|
||||
"author": "Iii Iii",
|
||||
"title": "Book Iii",
|
||||
"publishYear": "2012",
|
||||
"pageCount": 600
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Eee",
|
||||
"surname": "Fff",
|
||||
"books": [
|
||||
{
|
||||
"author": "Aaa Aaa",
|
||||
"title": "Book Aaa",
|
||||
"publishYear": "2027",
|
||||
"pageCount": 500
|
||||
},
|
||||
{
|
||||
"author": "Bbb Bbb",
|
||||
"title": "Book Bbb",
|
||||
"publishYear": "2018",
|
||||
"pageCount": 200
|
||||
},
|
||||
{
|
||||
"author": "Jjj Jjj",
|
||||
"title": "Book Jjj",
|
||||
"publishYear": "2001",
|
||||
"pageCount": 1000
|
||||
},
|
||||
{
|
||||
"author": "Kkk Kkk",
|
||||
"title": "Book Kkk",
|
||||
"publishYear": "1995",
|
||||
"pageCount": 700
|
||||
},
|
||||
{
|
||||
"author": "Lll Lll",
|
||||
"title": "Book Lll",
|
||||
"publishYear": "2025",
|
||||
"pageCount": 1100
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||