From c90037dcdf06bc43dceed76e71feebff18ce4bd3 Mon Sep 17 00:00:00 2001 From: nast1415 Date: Tue, 16 Feb 2016 11:33:29 +0300 Subject: [PATCH 1/5] set up dependencies --- hw02_starkova/pom.xml | 39 ++++ .../src/main/java/ru/spbau/mit/Album.java | 29 +++ .../src/main/java/ru/spbau/mit/Artist.java | 14 ++ .../java/ru/spbau/mit/FirstPartTasks.java | 76 +++++++ .../java/ru/spbau/mit/SecondPartTasks.java | 33 +++ .../src/main/java/ru/spbau/mit/Track.java | 20 ++ .../java/ru/spbau/mit/FirstPartTasksTest.java | 206 ++++++++++++++++++ .../ru/spbau/mit/SecondPartTasksTest.java | 28 +++ 8 files changed, 445 insertions(+) create mode 100644 hw02_starkova/pom.xml create mode 100644 hw02_starkova/src/main/java/ru/spbau/mit/Album.java create mode 100644 hw02_starkova/src/main/java/ru/spbau/mit/Artist.java create mode 100644 hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java create mode 100644 hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java create mode 100644 hw02_starkova/src/main/java/ru/spbau/mit/Track.java create mode 100644 hw02_starkova/src/test/java/ru/spbau/mit/FirstPartTasksTest.java create mode 100644 hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java diff --git a/hw02_starkova/pom.xml b/hw02_starkova/pom.xml new file mode 100644 index 0000000..5f8c5ad --- /dev/null +++ b/hw02_starkova/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + ru.spbau.aastarkova + JavaHomeworks + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + junit + junit + 4.12 + test + + + com.google.guava + guava + 19.0 + test + + + + + \ No newline at end of file diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/Album.java b/hw02_starkova/src/main/java/ru/spbau/mit/Album.java new file mode 100644 index 0000000..02e999f --- /dev/null +++ b/hw02_starkova/src/main/java/ru/spbau/mit/Album.java @@ -0,0 +1,29 @@ +package ru.spbau.mit; + +import java.util.Arrays; +import java.util.List; + +public class Album { + + private final String name; + private final List tracks; + private final Artist artist; + + public Album(Artist artist, String name, Track... tracks) { + this.name = name; + this.tracks = Arrays.asList(tracks); + this.artist = artist; + } + + public String getName() { + return name; + } + + public List getTracks() { + return tracks; + } + + public Artist getArtist() { + return artist; + } +} \ No newline at end of file diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/Artist.java b/hw02_starkova/src/main/java/ru/spbau/mit/Artist.java new file mode 100644 index 0000000..70442c4 --- /dev/null +++ b/hw02_starkova/src/main/java/ru/spbau/mit/Artist.java @@ -0,0 +1,14 @@ +package ru.spbau.mit; + +public class Artist { + + private final String name; + + public Artist(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java b/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java new file mode 100644 index 0000000..f4a5288 --- /dev/null +++ b/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java @@ -0,0 +1,76 @@ +package ru.spbau.mit; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public final class FirstPartTasks { + + private FirstPartTasks() { + } + + // Список названий альбомов + public static List allNames(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Список названий альбомов, отсортированный лексикографически по названию + public static List allNamesSorted(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums' + public static List allTracksSorted(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию + public static List sortedFavorites(Stream s) { + throw new UnsupportedOperationException(); + } + + // Сгруппировать альбомы по артистам + public static Map> groupByArtist(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя) + public static Map> groupByArtistMapName(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Число повторяющихся альбомов в потоке + public static long countAlbumDuplicates(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Альбом, в котором максимум рейтинга минимален + // (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0) + public static Optional minMaxRating(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет) + public static List sortByAverageRating(Stream albums) { + throw new UnsupportedOperationException(); + } + + // Произведение всех чисел потока по модулю 'modulo' + // (все числа от 0 до 10000) + public static int moduloProduction(IntStream stream, int modulo) { + throw new UnsupportedOperationException(); + } + + // Вернуть строку, состояющую из конкатенаций переданного массива, и окруженную строками "<", ">" + // см. тесты + public static String joinTo(String... strings) { + throw new UnsupportedOperationException(); + } + + // Вернуть поток из объектов класса 'clazz' + public static Stream filterIsInstance(Stream s, Class clazz) { + throw new UnsupportedOperationException(); + } +} \ No newline at end of file diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java b/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java new file mode 100644 index 0000000..bd180af --- /dev/null +++ b/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java @@ -0,0 +1,33 @@ +package ru.spbau.mit; + +import java.util.List; +import java.util.Map; + +public final class SecondPartTasks { + + private SecondPartTasks() {} + + // Найти строки из переданных файлов, в которых встречается указанная подстрока. + public static List findQuotes(List paths, CharSequence sequence) { + throw new UnsupportedOperationException(); + } + + // В квадрат с длиной стороны 1 вписана мишень. + // Стрелок атакует мишень и каждый раз попадает в произвольную точку квадрата. + // Надо промоделировать этот процесс с помощью класса java.util.Random и посчитать, какова вероятность попасть в мишень. + public static double piDividedBy4() { + throw new UnsupportedOperationException(); + } + + // Дано отображение из имени автора в список с содержанием его произведений. + // Надо вычислить, чья общая длина произведений наибольшая. + public static String findPrinter(Map> compositions) { + throw new UnsupportedOperationException(); + } + + // Вы крупный поставщик продуктов. Каждая торговая сеть делает вам заказ в виде Map<Товар, Количество>. + // Необходимо вычислить, какой товар и в каком количестве надо поставить. + public static Map calculateGlobalOrder(List> orders) { + throw new UnsupportedOperationException(); + } +} diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/Track.java b/hw02_starkova/src/main/java/ru/spbau/mit/Track.java new file mode 100644 index 0000000..d3136b9 --- /dev/null +++ b/hw02_starkova/src/main/java/ru/spbau/mit/Track.java @@ -0,0 +1,20 @@ +package ru.spbau.mit; + +public class Track { + + private final String name; + private final int rating; + + public Track(String name, int rating) { + this.name = name; + this.rating = rating; + } + + public String getName() { + return name; + } + + public int getRating() { + return rating; + } +} \ No newline at end of file diff --git a/hw02_starkova/src/test/java/ru/spbau/mit/FirstPartTasksTest.java b/hw02_starkova/src/test/java/ru/spbau/mit/FirstPartTasksTest.java new file mode 100644 index 0000000..6e3a665 --- /dev/null +++ b/hw02_starkova/src/test/java/ru/spbau/mit/FirstPartTasksTest.java @@ -0,0 +1,206 @@ +package ru.spbau.mit; + +import com.google.common.collect.ImmutableMap; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static org.junit.Assert.*; +import static ru.spbau.mit.FirstPartTasks.*; + +public class FirstPartTasksTest { + + @Test + public void testAllNames() { + assertEquals( + Arrays.asList("Sun Structures", "Keep In The Dark"), + allNames(Stream.of(ALBUM_0, ALBUM_1))); + + assertEquals( + Collections.emptyList(), + allNames(Stream.of())); + } + + @Test + public void testAllNamesSorted() { + assertEquals( + Arrays.asList("Keep In The Dark", "Sun Structures"), + allNamesSorted(Stream.of(ALBUM_0, ALBUM_1))); + + assertEquals( + Collections.emptyList(), + allNamesSorted(Stream.of())); + } + + @Test + public void testAllTracksSorted() { + assertEquals( + Arrays.asList( + "A Question Isn't Answered", "Colours to Life", "Fragment's Light", + "Jewel of Mine Eye", "Keep in the Dark", "Keep in the Dark", "Mesmerise", + "Move With The Season", "Sand Dance", "Shelter Song", "Sun Structures", + "Test of Time", "The Golden Throne", "The Guesser"), + allTracksSorted(Stream.of(ALBUM_0, ALBUM_1))); + + assertEquals( + Collections.emptyList(), + allTracksSorted(Stream.of())); + } + + @Test + public void testSortedFavorites() { + assertEquals( + Arrays.asList(ALBUM_13, ALBUM_18, ALBUM_10, ALBUM_5, ALBUM_12, ALBUM_4), + sortedFavorites(Stream.of(ALL_ALBUMS))); + + assertEquals( + Collections.emptyList(), + sortedFavorites(Stream.of())); + } + + @Test + public void testGroupByArtist() { + assertEquals( + ImmutableMap.of( + ARTIST_0, Arrays.asList(ALBUM_2, ALBUM_3), + ARTIST_3, Arrays.asList(ALBUM_9, ALBUM_10), + ARTIST_7, Arrays.asList(ALBUM_17, ALBUM_19)), + groupByArtist(Stream.of(ALBUM_2, ALBUM_9, ALBUM_3, ALBUM_10, ALBUM_17, ALBUM_19))); + + assertEquals( + Collections.emptyMap(), + groupByArtist(Stream.of())); + } + + @Test + public void testGroupByArtistMapName() { + assertEquals( + ImmutableMap.of( + ARTIST_0, Arrays.asList(ALBUM_2.getName(), ALBUM_3.getName()), + ARTIST_3, Arrays.asList(ALBUM_9.getName(), ALBUM_10.getName()), + ARTIST_7, Arrays.asList(ALBUM_17.getName(), ALBUM_19.getName())), + groupByArtistMapName(Stream.of(ALBUM_2, ALBUM_9, ALBUM_3, ALBUM_10, ALBUM_17, ALBUM_19))); + + assertEquals( + Collections.emptyMap(), + groupByArtistMapName(Stream.of())); + } + + @Test + public void testCountAlbumDuplicates() { + assertEquals( + 0, + countAlbumDuplicates(Stream.of(ALBUM_0, ALBUM_1, ALBUM_4))); + + assertEquals( + 0, + countAlbumDuplicates(Stream.of())); + + assertEquals( + 3, + countAlbumDuplicates(Stream.of(ALBUM_0, ALBUM_1, ALBUM_2, ALBUM_3, ALBUM_4, ALBUM_5, ALBUM_6, + ALBUM_7, ALBUM_8, ALBUM_9, ALBUM_10, ALBUM_11, ALBUM_12, ALBUM_13, ALBUM_14, ALBUM_15, ALBUM_16, + ALBUM_17, ALBUM_4, ALBUM_1, ALBUM_3, ALBUM_18, ALBUM_19))); + } + + @Test + public void testMinMaxRating() { + assertEquals( + Optional.of(ALBUM_9), + minMaxRating(Stream.of(ALBUM_2, ALBUM_9, ALBUM_3, ALBUM_10, ALBUM_17, ALBUM_19))); + + assertEquals( + Optional.empty(), + minMaxRating(Stream.of())); + } + + @Test + public void testSortByAverageRating() { + assertEquals( + Arrays.asList(ALBUM_10, ALBUM_3, ALBUM_2, ALBUM_9), + sortByAverageRating(Stream.of(ALBUM_2, ALBUM_9, ALBUM_3, ALBUM_10))); + + assertEquals( + Collections.emptyList(), + sortByAverageRating(Stream.of())); + } + + @Test + public void testModuloProduction() { + assertEquals( + 2, + moduloProduction(IntStream.of(1, 3, 5, 7, 2), 4)); + + assertEquals( + 720, + moduloProduction(IntStream.of(1, 2, 3, 4, 5, 6), 10000)); + } + + @Test + public void testJoinTo() { + assertEquals( + "", + joinTo("abc", "cde")); + + assertEquals( + "", + joinTo("abc")); + + assertEquals( + "<>", + joinTo()); + } + + @Test + public void testFilterIsInstance() { + assertEquals( + Arrays.asList("", "cde"), + filterIsInstance(Stream.of("", 1, 2.0, "cde"), CharSequence.class).collect(Collectors.toList())); + + assertEquals( + Collections.emptyList(), + filterIsInstance(Stream.of("", 1, 2.0, "cde"), Void.class).collect(Collectors.toList())); + + assertEquals( + Arrays.asList("", 1, 2.0, "cde"), + filterIsInstance(Stream.of("", 1, 2.0, "cde"), Object.class).collect(Collectors.toList())); + } + + private static final Artist ARTIST_0 = new Artist("Morcheeba"); + private static final Artist ARTIST_1 = new Artist("Temples"); + private static final Artist ARTIST_2 = new Artist("God Help the Girl"); + private static final Artist ARTIST_3 = new Artist("All India Radio"); + private static final Artist ARTIST_4 = new Artist("UNKLE"); + private static final Artist ARTIST_5 = new Artist("Bonobo"); + private static final Artist ARTIST_6 = new Artist("Grimes"); + private static final Artist ARTIST_7 = new Artist("Massive Attack"); + private static final Album ALBUM_0 = new Album(ARTIST_0, "Sun Structures", new Track("Shelter Song", 85), new Track("Sun Structures", 53), new Track("The Golden Throne", 72), new Track("Keep in the Dark", 49), new Track("Mesmerise", 85), new Track("Move With The Season", 16), new Track("Colours to Life", 37), new Track("A Question Isn't Answered", 50), new Track("The Guesser", 53), new Track("Test of Time", 92), new Track("Sand Dance", 21), new Track("Fragment's Light", 61)); + private static final Album ALBUM_1 = new Album(ARTIST_0, "Keep In The Dark", new Track("Keep in the Dark", 89), new Track("Jewel of Mine Eye", 83)); + private static final Album ALBUM_2 = new Album(ARTIST_0, "Big Calm", new Track("The Sea", 72), new Track("Shoulder Holster", 26), new Track("Part of the Process", 31), new Track("Blindfold", 84), new Track("Let Me See", 55), new Track("Bullet Proof", 24), new Track("Over and Over", 1), new Track("Friction", 56), new Track("diggin' in a watery grave", 53), new Track("Fear and Love", 5), new Track("Big Calm", 37)); + private static final Album ALBUM_3 = new Album(ARTIST_0, "Charango", new Track("Slow Down", 0), new Track("Otherwise", 36), new Track("Aqualung", 82), new Track("Sao Paulo", 44), new Track("Charango (Feat: Pace Won)", 20), new Track("What New York Couples Fight About (Feat: Kurt Wagner)", 50), new Track("Undress Me Now", 26), new Track("Way Beyond", 4), new Track("Women Lose Weight (Feat: Slick Rick)", 76), new Track("Get Along (Feat: Pace Won)", 88), new Track("Public Displays of Affection", 15), new Track("The Great London Traffic Warden Massacre", 43), new Track("Slow Down (Instrumental)", 94), new Track("Otherwise (Instrumental)", 52), new Track("Aqualung (Instrumental)", 19), new Track("Sao Paulo (Instrumental)", 21), new Track("Charango (Feat: Pace Won) (Instrumental)", 32), new Track("What New York Couples Fight About (Instrumental)", 47), new Track("Undress Me Now (Instrumental)", 55), new Track("Way Beyond (Instrumental)", 81), new Track("Women Lose Weight (Feat: Slick Rick) (Instrumental)", 77), new Track("Get Along (Feat: Pace Won) (Instrumental)", 76), new Track("Public Displays Of Affection (Instrumental)", 35), new Track("The Great London Traffic Warden Massacre (Instrumental)", 58)); + private static final Album ALBUM_4 = new Album(ARTIST_1, "Shelter Song", new Track("Shelter Song", 99), new Track("Prisms", 87)); + private static final Album ALBUM_5 = new Album(ARTIST_2, "God Help The Girl", new Track("I Suppose That Was A Prayer", 30), new Track("Act of the Apostle", 33), new Track("I Dumped You First", 52), new Track("Pretty When The Wind Blows", 75), new Track("I Know I Have To Eat", 53), new Track("God Help the Girl", 34), new Track("The Psychiatrist Is In", 35), new Track("The God Of Music", 86), new Track("If You Could Speak", 48), new Track("The Catwalk Of The Dukes", 42), new Track("Perfection as a Hipster", 43), new Track("Fuck This Shit", 50), new Track("Pretty Eve in the Tub", 14), new Track("A loving Kind Of Boy", 36), new Track("What Do You Want This Band To Sound Like", 43), new Track("Come Monday Night", 50), new Track("Collective Idiocy", 68), new Track("I'm Not Rich", 90), new Track("I'll Have to Dance With Cassie", 6), new Track("Stalinist Russia", 14), new Track("Baby’s Just Waiting", 50), new Track("Partick Whistle", 54), new Track("Musician, Please Take Heed", 33), new Track("I Just Want Your Jeans", 21), new Track("Invisible", 72), new Track("The World's Last Cassette", 98), new Track("A Down and Dusky Blonde", 51), new Track("Dress Up In You", 17)); + private static final Album ALBUM_6 = new Album(ARTIST_2, "God Help The Girl sd (Original Motion Picture Soundtrack)"); + private static final Album ALBUM_7 = new Album(ARTIST_2, "Stills EP"); + private static final Album ALBUM_8 = new Album(ARTIST_3, "Echo Other", new Track("Tropic of Unicorn", 18), new Track("Four Three", 86), new Track("The Time", 36), new Track("Sunshine Briefly", 33), new Track("Elizabethland", 41), new Track("The Quiet Ambient", 21), new Track("Song of the See", 95), new Track("Mexicola", 36), new Track("Ghost Dirt", 49), new Track("Whistle", 2), new Track("Echo Other", 13), new Track("Endless Highway", 89)); + private static final Album ALBUM_9 = new Album(ARTIST_3, "Permanent Evolutions", new Track("Open Sky Experiment (St-244 Remix)", 11), new Track("Permanent Revolutions (Don Meers remix)", 14), new Track("Little Mexico", 2), new Track("How Many, For How Long (Morphodic Bliss Mix)", 59), new Track("Dark Ambient (am mix)", 53), new Track("Life and How to Do It", 19), new Track("For Angel (All India Radio vs. Don Meers Mix)", 24), new Track("Lo Fi Groovy", 67), new Track("Walking On A.I.R.", 47), new Track("Delhi Dub", 64), new Track("Pray To The TV Funk (Left Brain Mix)", 69), new Track("A Moment (TV Version)", 1), new Track("Old India", 4), new Track("The Long Goodbye", 79)); + private static final Album ALBUM_10 = new Album(ARTIST_3, "Film Musik", new Track("The Quiet Ambient", 7), new Track("Last Port Of Call", 17), new Track("Permanent Revolutions", 84), new Track("Sunshine Briefly", 76), new Track("Mexicola", 86), new Track("Evening Star", 97), new Track("Horse Groove", 30), new Track("Waukaringa", 95), new Track("Deady Boy", 67), new Track("The Time", 57), new Track("Doing Stuff", 70), new Track("Far Away (Instrumental)", 37), new Track("Harmonium Across The Sea", 34), new Track("Dry (film mix)", 22), new Track("Gunslinger 3", 29), new Track("Its Happy Time", 35)); + private static final Album ALBUM_11 = new Album(ARTIST_4, "Psyence Fiction", new Track("Guns Blazing (Drums Of Death Pt. 1)", 17), new Track("U.N.K.L.E. Main Title Theme", 80), new Track("Lonely Soul", 51), new Track("Getting Ahead In The Lucrative Field Of Artist Management", 49), new Track("Nursery Rhyme/ Breather", 9), new Track("Celestial Annihilation", 36), new Track("The Knock (Drums Of Death Pt. 2)", 13), new Track("Chaos", 51), new Track("Rabbit in Your Headlights", 49), new Track("Outro (Mandatory)", 21)); + private static final Album ALBUM_12 = new Album(ARTIST_4, "Never, Never, Land", new Track("Back And Forth", 79), new Track("Eye for an Eye", 59), new Track("In A State", 47), new Track("Safe In Mind (Please Get This Gun From Out My Face)", 99), new Track("I Need Something Stronger", 39), new Track("What Are You To Me?", 14), new Track("Panic Attack", 88), new Track("Invasion", 49), new Track("Reign", 91), new Track("Glow", 87), new Track("Inside", 76)); + private static final Album ALBUM_13 = new Album(ARTIST_5, "Black Sands", new Track("Prelude", 43), new Track("Kiara", 29), new Track("Kong", 0), new Track("Eyesdown", 97), new Track("El Toro", 98), new Track("We Could Forever", 18), new Track("1009", 27), new Track("All in Forms", 20), new Track("The Keeper", 90), new Track("Stay the Same", 88), new Track("Animals", 49), new Track("Black Sands", 14)); + private static final Album ALBUM_14 = new Album(ARTIST_5, "Days to Come", new Track("Intro", 68), new Track("Days To Come", 41), new Track("Between The Lines", 79), new Track("The Fever", 81), new Track("Ketto", 6), new Track("Nightlite feat. Bajka", 32), new Track("Transmission 94 (Parts 1 & 2)", 19), new Track("On Your Marks", 3), new Track("If You Stayed Over", 7), new Track("Walk In The Sky", 74), new Track("Recurring", 32)); + private static final Album ALBUM_15 = new Album(ARTIST_6, "Visions", new Track("Infinite ❤ Without Fulfillment", 37), new Track("Genesis", 39), new Track("Oblivion", 26), new Track("Eight", 65), new Track("Circumambient", 37), new Track("Vowels = Space and Time", 20), new Track("Visiting Statue", 54), new Track("Be a Body (侘寂)", 22), new Track("Colour Of Moonlight (Antiochus) (Ft. Doldrums)", 36), new Track("Symphonia IX (My Wait Is U)", 78), new Track("Nightmusic (Ft. Majical Cloudz)", 8), new Track("Skin", 44), new Track("Know the Way", 72)); + private static final Album ALBUM_16 = new Album(ARTIST_6, "Art Angels"); + private static final Album ALBUM_17 = new Album(ARTIST_7, "Mezzanine", new Track("Angel", 75), new Track("Risingson", 26), new Track("Teardrop", 93), new Track("Inertia Creeps", 65), new Track("Exchange", 76), new Track("Dissolved Girl", 87), new Track("Man Next Door", 50), new Track("Black Milk", 45), new Track("Mezzanine", 5), new Track("Group Four", 95), new Track("(Exchange)", 89)); + private static final Album ALBUM_18 = new Album(ARTIST_7, "Blue Lines", new Track("Safe From Harm", 99), new Track("One Love", 71), new Track("Blue Lines", 89), new Track("Be Thankful for What You've Got", 20), new Track("Five Man Army", 10), new Track("Unfinished Sympathy", 58), new Track("Daydreaming", 60), new Track("Lately", 27), new Track("Hymn Of The Big Wheel", 27)); + private static final Album ALBUM_19 = new Album(ARTIST_7, "Heligoland", new Track("Pray for Rain", 61), new Track("Babel", 26), new Track("Splitting the Atom", 37), new Track("Girl I Love You", 2), new Track("Psyche", 37), new Track("Flat of the Blade", 74), new Track("Paradise Circus", 11), new Track("Rush Minute", 53), new Track("Saturday Come Slow", 91), new Track("Atlas Air (Instrumental)", 41), new Track("Paradise Circus (Gui Boratto Remix)", 69), new Track("Fatalism (Ryuichi Sakamoto & Yukihiro Takahashi Remix)", 24), new Track("Girl I Love You (She is Danger Remix)", 7), new Track("Paradise Circus (Breakage's Tight Rope Remix)", 92)); + private static final Album[] ALL_ALBUMS = new Album[]{ALBUM_0, ALBUM_1, ALBUM_2, ALBUM_3, ALBUM_4, ALBUM_5, ALBUM_6, + ALBUM_7, ALBUM_8, ALBUM_9, ALBUM_10, ALBUM_11, ALBUM_12, ALBUM_13, ALBUM_14, ALBUM_15, ALBUM_16, ALBUM_17, + ALBUM_18, ALBUM_19 + }; +} diff --git a/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java b/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java new file mode 100644 index 0000000..df8d67e --- /dev/null +++ b/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java @@ -0,0 +1,28 @@ +package ru.spbau.mit; + +import org.junit.Test; + +import static org.junit.Assert.fail; + +public class SecondPartTasksTest { + + @Test + public void testFindQuotes() { + fail(); + } + + @Test + public void testPiDividedBy4() { + fail(); + } + + @Test + public void testFindPrinter() { + fail(); + } + + @Test + public void testCalculateGlobalOrder() { + fail(); + } +} \ No newline at end of file From 485cc0c80bbcd7be6effc4092ba3a57a16925e95 Mon Sep 17 00:00:00 2001 From: nast1415 Date: Sun, 21 Feb 2016 20:32:09 +0300 Subject: [PATCH 2/5] first part done --- .../java/ru/spbau/mit/FirstPartTasks.java | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java b/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java index f4a5288..91f592f 100644 --- a/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java +++ b/hw02_starkova/src/main/java/ru/spbau/mit/FirstPartTasks.java @@ -1,8 +1,8 @@ package ru.spbau.mit; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -13,64 +13,74 @@ private FirstPartTasks() { // Список названий альбомов public static List allNames(Stream albums) { - throw new UnsupportedOperationException(); + return albums.map(Album::getName).collect(Collectors.toList()); } // Список названий альбомов, отсортированный лексикографически по названию public static List allNamesSorted(Stream albums) { - throw new UnsupportedOperationException(); + return albums.map(Album::getName).sorted().collect(Collectors.toList()); } // Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums' public static List allTracksSorted(Stream albums) { - throw new UnsupportedOperationException(); + return albums.map(Album::getTracks).flatMap(Collection::stream).map(Track::getName) + .sorted().collect(Collectors.toList()); } // Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию public static List sortedFavorites(Stream s) { - throw new UnsupportedOperationException(); + return s.filter(album -> album.getTracks().stream().anyMatch(track -> track.getRating() > 95)) + .sorted((album1, album2) -> album1.getName().compareTo(album2.getName())) + .collect(Collectors.toList()); } // Сгруппировать альбомы по артистам public static Map> groupByArtist(Stream albums) { - throw new UnsupportedOperationException(); + return albums.collect(Collectors.groupingBy(Album::getArtist)); } - // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя) + // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Album' использовать его имя) public static Map> groupByArtistMapName(Stream albums) { - throw new UnsupportedOperationException(); + return albums.collect(Collectors.groupingBy( + Album::getArtist, + Collectors.mapping(Album::getName, Collectors.toList()))); } // Число повторяющихся альбомов в потоке public static long countAlbumDuplicates(Stream albums) { - throw new UnsupportedOperationException(); + return albums.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) + .entrySet().stream() + .filter(albumLongEntry -> albumLongEntry.getValue() > 1).count(); } // Альбом, в котором максимум рейтинга минимален // (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0) public static Optional minMaxRating(Stream albums) { - throw new UnsupportedOperationException(); + return albums.min(Comparator.comparing(album -> album.getTracks().stream() + .map(Track::getRating).max(Comparator.naturalOrder()).orElse(0))); } // Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет) public static List sortByAverageRating(Stream albums) { - throw new UnsupportedOperationException(); + return albums.sorted(Comparator.comparing(album -> album.getTracks().stream() + .mapToDouble(Track::getRating) + .average().orElse(0), Comparator.reverseOrder())).collect(Collectors.toList()); } // Произведение всех чисел потока по модулю 'modulo' // (все числа от 0 до 10000) public static int moduloProduction(IntStream stream, int modulo) { - throw new UnsupportedOperationException(); + return stream.reduce(1, (x, y) -> x * y % modulo); } // Вернуть строку, состояющую из конкатенаций переданного массива, и окруженную строками "<", ">" // см. тесты public static String joinTo(String... strings) { - throw new UnsupportedOperationException(); + return Arrays.stream(strings).collect(Collectors.joining(", ", "<", ">")); } // Вернуть поток из объектов класса 'clazz' public static Stream filterIsInstance(Stream s, Class clazz) { - throw new UnsupportedOperationException(); + return s.filter(clazz::isInstance).map(clazz::cast); } } \ No newline at end of file From 73a25a14e55044c577620be10dfcac17e8f89fad Mon Sep 17 00:00:00 2001 From: nast1415 Date: Sun, 21 Feb 2016 23:13:19 +0300 Subject: [PATCH 3/5] second part tasks done --- .../java/ru/spbau/mit/SecondPartTasks.java | 64 +++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java b/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java index bd180af..4112256 100644 --- a/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java +++ b/hw02_starkova/src/main/java/ru/spbau/mit/SecondPartTasks.java @@ -1,33 +1,87 @@ package ru.spbau.mit; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.DoubleStream; +import java.util.stream.Stream; + public final class SecondPartTasks { - private SecondPartTasks() {} + private SecondPartTasks() { + } // Найти строки из переданных файлов, в которых встречается указанная подстрока. public static List findQuotes(List paths, CharSequence sequence) { - throw new UnsupportedOperationException(); + return paths.stream().map(Paths::get).flatMap(path -> { + try { + return Files.lines(path); + } catch (IOException ignored) { + return Stream.empty(); + } + }).filter(str -> str.contains(sequence)) + .collect(Collectors.toList()); } // В квадрат с длиной стороны 1 вписана мишень. // Стрелок атакует мишень и каждый раз попадает в произвольную точку квадрата. // Надо промоделировать этот процесс с помощью класса java.util.Random и посчитать, какова вероятность попасть в мишень. + private static final int NUMBER_OF_ROUNDS = 10000000; + private static final double RADIUS = 0.5; + + private static final Random RANDOM = new Random(); + public static double piDividedBy4() { - throw new UnsupportedOperationException(); + return DoubleStream + .generate( + () -> Math.pow(RANDOM.nextDouble() - RADIUS, 2) + Math.pow(RANDOM.nextDouble() - RADIUS, 2) + ) + .limit(NUMBER_OF_ROUNDS).map( + x -> { + if (x <= Math.pow(RADIUS, 2)) { + return 1; + } else { + return 0; + } + } + ).average().getAsDouble(); + } // Дано отображение из имени автора в список с содержанием его произведений. // Надо вычислить, чья общая длина произведений наибольшая. + public static String findPrinter(Map> compositions) { - throw new UnsupportedOperationException(); + return compositions.entrySet().stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + list -> list.getValue().stream() + .collect(Collectors.summingInt(String::length)) + ) + ).entrySet().stream().max( + Comparator.comparing(Map.Entry::getValue) + ) + .map(Map.Entry::getKey) + .orElse(null); } // Вы крупный поставщик продуктов. Каждая торговая сеть делает вам заказ в виде Map<Товар, Количество>. // Необходимо вычислить, какой товар и в каком количестве надо поставить. public static Map calculateGlobalOrder(List> orders) { - throw new UnsupportedOperationException(); + return orders.stream().flatMap(map -> map.entrySet().stream()) + .collect(Collectors.groupingBy( + Map.Entry::getKey, + Collectors.summingInt(Map.Entry::getValue) + ) + ); + + } } From 3cf9ffdade6e9a4f5bf809b539de941cbe194cf3 Mon Sep 17 00:00:00 2001 From: nast1415 Date: Sun, 21 Feb 2016 23:56:49 +0300 Subject: [PATCH 4/5] files for FindQuotes test added --- hw02_starkova/src/test/forTests/FindQuotesTest1.txt | 8 ++++++++ hw02_starkova/src/test/forTests/FindQuotesTest2.txt | 5 +++++ 2 files changed, 13 insertions(+) create mode 100644 hw02_starkova/src/test/forTests/FindQuotesTest1.txt create mode 100644 hw02_starkova/src/test/forTests/FindQuotesTest2.txt diff --git a/hw02_starkova/src/test/forTests/FindQuotesTest1.txt b/hw02_starkova/src/test/forTests/FindQuotesTest1.txt new file mode 100644 index 0000000..b800b58 --- /dev/null +++ b/hw02_starkova/src/test/forTests/FindQuotesTest1.txt @@ -0,0 +1,8 @@ +meow-meow +mur-mur-meow + +meow meow meow + +fyr-fyr + + 11meow22 diff --git a/hw02_starkova/src/test/forTests/FindQuotesTest2.txt b/hw02_starkova/src/test/forTests/FindQuotesTest2.txt new file mode 100644 index 0000000..0790fcf --- /dev/null +++ b/hw02_starkova/src/test/forTests/FindQuotesTest2.txt @@ -0,0 +1,5 @@ +firstString in a text for a first test + second string in a text for a first test + thirdstringinatextforafirsttest + only String + string \ No newline at end of file From 41e211e95c61f9ffd6b22475d9431019d4826f01 Mon Sep 17 00:00:00 2001 From: nast1415 Date: Sun, 21 Feb 2016 23:58:15 +0300 Subject: [PATCH 5/5] tests for second part done --- .../ru/spbau/mit/SecondPartTasksTest.java | 79 +++++++++++++++++-- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java b/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java index df8d67e..a7129c8 100644 --- a/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java +++ b/hw02_starkova/src/test/java/ru/spbau/mit/SecondPartTasksTest.java @@ -2,27 +2,96 @@ import org.junit.Test; -import static org.junit.Assert.fail; +import java.util.*; + +import static org.junit.Assert.*; public class SecondPartTasksTest { @Test public void testFindQuotes() { - fail(); + List firstAnswer = Arrays.asList( + "meow-meow", + "mur-mur-meow", + "meow meow meow", + " 11meow22" + ); + + List secondAnswer = Arrays.asList( + " second string in a text for a first test", + " thirdstringinatextforafirsttest", + " string" + ); + + List paths = Arrays.asList( + "src/test/forTests/FindQuotesTest1.txt", + "src/test/forTests/FindQuotesTest2.txt" + ); + + assertEquals(firstAnswer, SecondPartTasks.findQuotes(paths, "meow")); + assertEquals(secondAnswer, SecondPartTasks.findQuotes(paths, "string")); + assertEquals(Collections.emptyList(), SecondPartTasks.findQuotes(paths, "meow-meow-test")); } + @Test public void testPiDividedBy4() { - fail(); + assertEquals(Math.PI / 4, SecondPartTasks.piDividedBy4(), 1e-3); } @Test public void testFindPrinter() { - fail(); + Map> compositions = new HashMap<>(); + assertEquals(null, SecondPartTasks.findPrinter(compositions)); + + compositions.put("Susan", Arrays.asList("meow", "hello, world!", "beautiful day", "arrr")); + compositions.put("Martie", Arrays.asList("aaa", "bbbbbb", "g")); + compositions.put("Emily", Arrays.asList("the biggest string", "c", "", "", "meow-meow-meow")); + assertEquals("Susan", SecondPartTasks.findPrinter(compositions)); + + compositions.remove("Susan"); + assertEquals("Emily", SecondPartTasks.findPrinter(compositions)); + + compositions.put("John", Collections.singletonList("12345678910111213141516171819202122")); + assertEquals("John", SecondPartTasks.findPrinter(compositions)); } @Test public void testCalculateGlobalOrder() { - fail(); + String first = "dresses"; + String second = "cats"; + String third = "tea"; + + assertEquals(new HashMap(), + SecondPartTasks.calculateGlobalOrder(Collections.emptyList()) + ); + + HashMap firstOrder = new HashMap<>(); + firstOrder.put(first, 150); + firstOrder.put(second, 40); + firstOrder.put(third, 1); + + HashMap secondOrder = new HashMap<>(); + secondOrder.put(first, 34); + secondOrder.put(third, 12); + + HashMap thirdOrder = new HashMap<>(); + thirdOrder.put(first, 2); + thirdOrder.put(second, 5); + + HashMap totalOrder = new HashMap<>(); + totalOrder.put(first, 150 + 34 + 2); + totalOrder.put(second, 40 + 5); + totalOrder.put(third, 1 + 12); + + assertEquals(secondOrder, + SecondPartTasks.calculateGlobalOrder(Collections.singletonList(secondOrder)) + ); + + assertEquals(totalOrder, + SecondPartTasks.calculateGlobalOrder(Arrays.asList(firstOrder, secondOrder, thirdOrder)) + ); + + } } \ No newline at end of file