Софтуерно Инженерство
Loading...
+ Нов въпрос
Lyubosumaz avatar Lyubosumaz 5 Точки

10. Race <Направена е задачата, но имам много въпроси, помогни ми>

Това е кодът:

https://pastebin.com/MrkjibVa

Условие:

https://judge.softuni.bg/Contests/Compete/Index/1331#9

Тази задача на прочит изглежда много лесна. Започнеш ли да я пишеш става страшно.

11 ред inputa го запазвам в ArrayList за да имам проверката на 28 ред.

Как мога да направя regexa да търси две стойности - на вход: G4e@55or%6g6!68e!!@ - с един regex да взема всички букви (а = George) и вскички числа (б = 4556668). Има ли някакъв синтаксис? Два различни regexa, не е интересно.

Задачката я продължавам с текстообработка.

Стойностите ги запазвам в LinkedHashMap. Това мое решение направи outputa невъзможен. Задачата изисква принтиране в "descending order" на първите трима състезатели.

За самото принтиране, трябваше да се науча да запазвам stream-нат map с collect, има ли начин това да стане без нужда от нова променлива която да държи сортировката? Как можем да запишем всички ключове от Map в List<String>? Има ли по лесен начин за принтиране от това положение?

Аз запазвам сортировката на първия Map в нов Map, после втория сортиран Map, от който ми трябва само "index(0)", го взима нов Map(трети), който не съм сигурен какво прави с .iterator().next(), но мога за взема началото на Mapа, а той започва с key.

Счупих си главата.

Тагове:
1
Fundamentals Module 27/03/2019 18:07:08
VasilKotsev avatar VasilKotsev 803 Точки
Best Answer

Регулярният израз описва шаблон за търсене в текст. Няма как да ти изкара само буквите от някакъв разбъркан низ, той матчва каквото му зададеш. Естествено можеш да му "изшиеш" един: "[A-Za-z]+", но така ще трябва постоянно да въртиш някакъв цикъл до края на низа и да матчваш, след което да записваш стойностите в някакъв StringBuilder. Регулярните изрази са доста мощен туул, когато знаеш как да боравиш с тях, но винаги можеш да го счупиш и да не покриеш всички case-ове. Всичко, което може да се обработи с RegEx, може да стане и с нормална стрингообработка с държавните методи на даден език. Тук по-скоро най-лесно ще е да обиколиш стринга като масив от чарове и да проверяваш дали Character.IsLetter(x) e true и да го записваш в стринг билдър/стринг, идентично и за цифрите.

Edit: Понеже не видях, че питаш и за сортировките ето ти решението оправено: Link. Не пиша под джава, но го оправих набързо. Не ти трябва нов мап, можеш да преизползваш първия. Не е нужно да си усложняваш излишно задачата, единствено принтирането е тъпо защото трябва да има проверки за 1st, 2nd, 3rd.

0
26/03/2019 21:22:44
Lyubosumaz avatar Lyubosumaz 5 Точки

Много ги чупя регексите. Все още нямам правилен синтаксис, което е проблем за логиката.

При мен winners = winners.entrySet()..., нещо ми го подчертаваме, не знам защо. Ще го погледна.

Това ме изкефи .limit(3)

Много хубаво принтиране, ще си го запазя този код. Първия placeholder в (String.format("%s place: %s") се чудех как да го направя, твоя начин е супер

Мерси

0
27/03/2019 18:08:11
Hristo13 avatar Hristo13 236 Точки

Интересен начин за принтирането с този entrySet().iterator().next();

0
Lyubosumaz avatar Lyubosumaz 5 Точки

Този начин е когато трябва да ходиш на работа и само гледаш в нета за кръпки по кода. Но работи.

0
27/03/2019 18:06:05
k.sevov avatar k.sevov 1067 Точки

Здравей, колега. Чудесно е, че си задал толкова въпроси на вече решена задача, точно това е правилният подход към нещата :) Доста интересно решение си намерил, но и доста сложно. Като цяло по тези задачи никога не се налага да прехвърляме един мап в друг, винаги има някакъв по-лесен начин. Ето ти още един вариант за решение, в който се опитах да включа някоя и друга различна идея. 

0
Lyubosumaz avatar Lyubosumaz 5 Точки

Това - for (char ch : input.toCharArray()) - mind blowing, много e яко.

Това '0' в - distance += ch - '0'; е за integer?

Само това - .sorted(Comparator.comparing(winners::get, Comparator.reverseOrder())).collect(Collectors.toList()); - взимаш всички ключове в descending и ги collect-ваш в нов лист. Нямаш представа това колко време се опитвах да намеря точно това.

Мерси

0
k.sevov avatar k.sevov 1067 Точки

Това с изваждането на '0' за конверсия от char към int работи заради ASCII стойностите. Става така, тъй като когато правим аритметични операции с char се използва тяхната ASCII репрезентация, а символите от 0-9 са подред в таблицата. Нулата е 48 и като имаме примерно символа '3' се получава '3' - '0' = 51 - 48 = 3.

В компаратора сега гледам е малко объркващо това winners::get, че си го цъкнах по навик на IntelliJ да го съкрати, но реално си е x -> winners.get(x) и подрежда ключовете по отговарящите им стойности.

0
JwRBG avatar JwRBG 2 Точки

Привет,

Това е моето решение , но получавам 80 точки , някаква идея каква проверка пропускам ?

 

https://pastebin.com/Vsbwf9p5

0