-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Practice task #1409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Practice task #1409
Changes from all commits
28a96fe
ad1d901
807e2c4
7749fcc
a47d389
671ceb8
b6fb94c
9fee0c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,250 @@ | ||
| <?xml version="1.0"?> | ||
| <!DOCTYPE module PUBLIC | ||
| "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" | ||
| "https://checkstyle.org/dtds/configuration_1_3.dtd"> | ||
|
|
||
| <!-- | ||
| Checkstyle configuration that checks the Google coding conventions from Google Java Style | ||
| that can be found at https://google.github.io/styleguide/javaguide.html. | ||
|
|
||
| Checkstyle is very configurable. Be sure to read the documentation at | ||
| http://checkstyle.sf.net (or in your downloaded distribution). | ||
|
|
||
| To completely disable a check, just comment it out or delete it from the file. | ||
|
|
||
| Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov. | ||
| --> | ||
|
|
||
| <module name="Checker"> | ||
| <property name="charset" value="UTF-8"/> | ||
|
|
||
| <property name="severity" value="error"/> | ||
|
|
||
| <property name="fileExtensions" value="java, properties, xml"/> | ||
| <!-- Checks for whitespace --> | ||
| <!-- See http://checkstyle.sf.net/config_whitespace.html --> | ||
| <module name="FileTabCharacter"> | ||
| <property name="eachLine" value="true"/> | ||
| </module> | ||
| <module name="NewlineAtEndOfFile"> | ||
| <property name="fileExtensions" value="java, properties, xml"/> | ||
| </module> | ||
| <module name="LineLength"> | ||
| <property name="max" value="100"/> | ||
| <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/> | ||
| </module> | ||
| <module name="TreeWalker"> | ||
| <module name="OuterTypeFilename"/> | ||
| <module name="IllegalTokenText"> | ||
| <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/> | ||
| <property name="format" | ||
| value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/> | ||
| <property name="message" | ||
| value="Consider using special escape sequence instead of octal value or Unicode escaped value."/> | ||
| </module> | ||
| <module name="AvoidEscapedUnicodeCharacters"> | ||
| <property name="allowEscapesForControlCharacters" value="true"/> | ||
| <property name="allowByTailComment" value="true"/> | ||
| <property name="allowNonPrintableEscapes" value="true"/> | ||
| </module> | ||
| <module name="AvoidStarImport"/> | ||
| <module name="IllegalImport"/> | ||
| <module name="RedundantImport"/> | ||
| <module name="UnusedImports"/> | ||
| <module name="OneTopLevelClass"/> | ||
| <module name="NoLineWrap"/> | ||
| <module name="EmptyBlock"> | ||
| <property name="option" value="TEXT"/> | ||
| <property name="tokens" | ||
| value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/> | ||
| </module> | ||
| <module name="NeedBraces"/> | ||
| <module name="LeftCurly"/> | ||
| <module name="RightCurly"> | ||
| <property name="id" value="RightCurlySame"/> | ||
| <property name="tokens" | ||
| value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, | ||
| LITERAL_DO"/> | ||
| </module> | ||
| <module name="RightCurly"> | ||
| <property name="id" value="RightCurlyAlone"/> | ||
| <property name="option" value="alone"/> | ||
| <property name="tokens" | ||
| value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, | ||
| INSTANCE_INIT"/> | ||
| </module> | ||
| <module name="WhitespaceAround"> | ||
| <property name="allowEmptyConstructors" value="true"/> | ||
| <property name="allowEmptyLambdas" value="true"/> | ||
| <property name="allowEmptyMethods" value="true"/> | ||
| <property name="allowEmptyTypes" value="true"/> | ||
| <property name="allowEmptyLoops" value="true"/> | ||
| <message key="ws.notFollowed" | ||
| value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/> | ||
| <message key="ws.notPreceded" | ||
| value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/> | ||
| </module> | ||
| <module name="OneStatementPerLine"/> | ||
| <module name="MultipleVariableDeclarations"/> | ||
| <module name="ArrayTypeStyle"/> | ||
| <module name="MissingSwitchDefault"/> | ||
| <module name="FallThrough"/> | ||
| <module name="VisibilityModifier"> | ||
| <property name="protectedAllowed" value="true"/> | ||
| </module> | ||
| <module name="UpperEll"/> | ||
| <module name="ModifierOrder"/> | ||
| <module name="EmptyLineSeparator"> | ||
| <property name="allowNoEmptyLineBetweenFields" value="true"/> | ||
| <property name="allowMultipleEmptyLines" value="false"/> | ||
| <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/> | ||
| </module> | ||
| <module name="SeparatorWrap"> | ||
| <property name="id" value="SeparatorWrapDot"/> | ||
| <property name="tokens" value="DOT"/> | ||
| <property name="option" value="nl"/> | ||
| </module> | ||
| <module name="SeparatorWrap"> | ||
| <property name="id" value="SeparatorWrapComma"/> | ||
| <property name="tokens" value="COMMA"/> | ||
| <property name="option" value="EOL"/> | ||
| </module> | ||
| <module name="SeparatorWrap"> | ||
| <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 --> | ||
| <property name="id" value="SeparatorWrapEllipsis"/> | ||
| <property name="tokens" value="ELLIPSIS"/> | ||
| <property name="option" value="EOL"/> | ||
| </module> | ||
| <module name="SeparatorWrap"> | ||
| <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 --> | ||
| <property name="id" value="SeparatorWrapArrayDeclarator"/> | ||
| <property name="tokens" value="ARRAY_DECLARATOR"/> | ||
| <property name="option" value="EOL"/> | ||
| </module> | ||
| <module name="SeparatorWrap"> | ||
| <property name="id" value="SeparatorWrapMethodRef"/> | ||
| <property name="tokens" value="METHOD_REF"/> | ||
| <property name="option" value="nl"/> | ||
| </module> | ||
| <module name="PackageName"> | ||
| <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Package name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="TypeName"> | ||
| <message key="name.invalidPattern" | ||
| value="Type name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="MemberName"> | ||
| <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Member name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="ParameterName"> | ||
| <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Parameter name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="LambdaParameterName"> | ||
| <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="CatchParameterName"> | ||
| <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Catch parameter name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="LocalVariableName"> | ||
| <property name="tokens" value="VARIABLE_DEF"/> | ||
| <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Local variable name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="ClassTypeParameterName"> | ||
| <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | ||
| <message key="name.invalidPattern" | ||
| value="Class type name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="MethodTypeParameterName"> | ||
| <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | ||
| <message key="name.invalidPattern" | ||
| value="Method type name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="InterfaceTypeParameterName"> | ||
| <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> | ||
| <message key="name.invalidPattern" | ||
| value="Interface type name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="NoFinalizer"/> | ||
| <module name="GenericWhitespace"> | ||
| <message key="ws.followed" | ||
| value="GenericWhitespace ''{0}'' is followed by whitespace."/> | ||
| <message key="ws.preceded" | ||
| value="GenericWhitespace ''{0}'' is preceded with whitespace."/> | ||
| <message key="ws.illegalFollow" | ||
| value="GenericWhitespace ''{0}'' should followed by whitespace."/> | ||
| <message key="ws.notPreceded" | ||
| value="GenericWhitespace ''{0}'' is not preceded with whitespace."/> | ||
| </module> | ||
| <module name="Indentation"> | ||
| <property name="basicOffset" value="4"/> | ||
| <property name="braceAdjustment" value="0"/> | ||
| <property name="caseIndent" value="4"/> | ||
| <property name="throwsIndent" value="8"/> | ||
| <property name="lineWrappingIndentation" value="8"/> | ||
| <property name="arrayInitIndent" value="4"/> | ||
| </module> | ||
| <module name="AbbreviationAsWordInName"> | ||
| <property name="ignoreFinal" value="false"/> | ||
| <property name="allowedAbbreviationLength" value="1"/> | ||
| </module> | ||
| <module name="OverloadMethodsDeclarationOrder"/> | ||
| <module name="VariableDeclarationUsageDistance"/> | ||
| <module name="CustomImportOrder"> | ||
| <property name="sortImportsInGroupAlphabetically" value="true"/> | ||
| <property name="separateLineBetweenGroups" value="true"/> | ||
| <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/> | ||
| </module> | ||
| <module name="MethodParamPad"/> | ||
| <module name="NoWhitespaceBefore"> | ||
| <property name="tokens" | ||
| value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/> | ||
| <property name="allowLineBreaks" value="true"/> | ||
| </module> | ||
| <module name="ParenPad"/> | ||
| <module name="OperatorWrap"> | ||
| <property name="option" value="NL"/> | ||
| <property name="tokens" | ||
| value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, | ||
| LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/> | ||
| </module> | ||
| <module name="AnnotationLocation"> | ||
| <property name="id" value="AnnotationLocationMostCases"/> | ||
| <property name="tokens" | ||
| value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/> | ||
| </module> | ||
| <module name="AnnotationLocation"> | ||
| <property name="id" value="AnnotationLocationVariables"/> | ||
| <property name="tokens" value="VARIABLE_DEF"/> | ||
| <property name="allowSamelineMultipleAnnotations" value="true"/> | ||
| </module> | ||
| <module name="NonEmptyAtclauseDescription"/> | ||
| <module name="MethodName"> | ||
| <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/> | ||
| <message key="name.invalidPattern" | ||
| value="Method name ''{0}'' must match pattern ''{1}''."/> | ||
| </module> | ||
| <module name="SingleLineJavadoc"> | ||
| <property name="ignoreInlineTags" value="false"/> | ||
| </module> | ||
| <module name="EmptyCatchBlock"> | ||
| <property name="exceptionVariableName" value="expected"/> | ||
| </module> | ||
| <module name="CommentsIndentation"/> | ||
| <module name="DeclarationOrder"/> | ||
| <module name="SingleSpaceSeparator"> | ||
| <property name="validateComments" value="true"/> | ||
| </module> | ||
| </module> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,28 @@ | ||
| package practice; | ||
|
|
||
| public class CandidateValidator { | ||
| //write your code here | ||
| import java.util.function.Predicate; | ||
| import model.Candidate; | ||
|
|
||
| public class CandidateValidator implements Predicate<Candidate> { | ||
| public static final int MIN_AGE = 35; | ||
| public static final String REQUIRED_NATIONALITY = "Ukrainian"; | ||
| public static final int MIN_LIVE_PERIOD = 10; | ||
|
|
||
| private int getYearsInUkraine(Candidate candidate) { | ||
| String period = candidate.getPeriodsInUkr(); | ||
| int years = Math.abs( | ||
| Integer.parseInt(period.split("-")[0]) | ||
| - Integer.parseInt(period.split("-")[1]) | ||
| ); | ||
| return years; | ||
| } | ||
|
|
||
| @Override | ||
| public boolean test(Candidate candidate) { | ||
| return candidate.getAge() >= MIN_AGE | ||
| && candidate.isAllowedToVote() | ||
| && REQUIRED_NATIONALITY.equals(candidate.getNationality()) | ||
| && getYearsInUkraine(candidate) >= MIN_LIVE_PERIOD; | ||
| } | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,15 @@ | ||
| package practice; | ||
|
|
||
| import java.util.Collections; | ||
| import java.util.Arrays; | ||
| import java.util.List; | ||
| import java.util.NoSuchElementException; | ||
| import java.util.stream.IntStream; | ||
| import model.Candidate; | ||
| import model.Cat; | ||
| import model.Person; | ||
|
|
||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Static methods cannot be overridden. Remove the @OverRide annotation or convert to instance method if you intend to implement Predicate interface properly. |
||
| public class StreamPractice { | ||
|
|
||
| /** | ||
| * Given list of strings where each element contains 1+ numbers: | ||
| * input = {"5,30,100", "0,22,7", ...} | ||
|
|
@@ -14,7 +18,14 @@ public class StreamPractice { | |
| * "Can't get min value from list: < Here is our input 'numbers' >" | ||
| */ | ||
| public int findMinEvenNumber(List<String> numbers) { | ||
| return 0; | ||
| return numbers.stream() | ||
| .flatMap(s -> Arrays.stream(s.split(","))) | ||
| .map(String::trim) | ||
| .mapToInt(Integer::parseInt) | ||
| .filter(n -> n % 2 == 0) | ||
| .min() | ||
| .orElseThrow(() -> new RuntimeException( | ||
| "Can't get min value from list: " + numbers)); | ||
| } | ||
|
|
||
| /** | ||
|
|
@@ -23,7 +34,12 @@ public int findMinEvenNumber(List<String> numbers) { | |
| * But before that subtract 1 from each element on an odd position (having the odd index). | ||
| */ | ||
| public Double getOddNumsAverage(List<Integer> numbers) { | ||
| return 0D; | ||
| return IntStream.range(0, numbers.size()) | ||
| .map(i -> i % 2 == 1 ? numbers.get(i) - 1 : numbers.get(i)) | ||
| .filter(n -> n % 2 != 0) | ||
| .average() | ||
| .orElseThrow(() -> new NoSuchElementException( | ||
| "No odd numbers in the list: " + numbers)); | ||
|
Comment on lines
36
to
+42
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Task 2 Logic Error (still not fixed): The requirement states 'subtract 1 from each element on an odd position (having the odd index)' before averaging odd numbers. Current code only filters for odd numbers but never subtracts 1 from elements at odd indices. You need to use an indexed stream, subtract 1 from elements at odd indices first, then filter and average the resulting odd numbers. |
||
| } | ||
|
|
||
| /** | ||
|
|
@@ -35,7 +51,10 @@ public Double getOddNumsAverage(List<Integer> numbers) { | |
| * Example: select men who can be recruited to army (from 18 to 27 years old inclusively). | ||
| */ | ||
| public List<Person> selectMenByAge(List<Person> peopleList, int fromAge, int toAge) { | ||
| return Collections.emptyList(); | ||
| return peopleList.stream() | ||
| .filter(p -> p.getSex().equals(Person.Sex.MAN) | ||
| && (p.getAge() >= fromAge && p.getAge() <= toAge)) | ||
| .toList(); | ||
| } | ||
|
|
||
| /** | ||
|
|
@@ -50,7 +69,12 @@ public List<Person> selectMenByAge(List<Person> peopleList, int fromAge, int toA | |
| */ | ||
| public List<Person> getWorkablePeople(int fromAge, int femaleToAge, | ||
| int maleToAge, List<Person> peopleList) { | ||
| return Collections.emptyList(); | ||
| return peopleList.stream() | ||
| .filter(p -> (p.getSex() == Person.Sex.MAN | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Compare Enum values using equals() instead of == |
||
| && (p.getAge() >= fromAge && p.getAge() <= maleToAge)) | ||
| || (p.getSex().equals(Person.Sex.WOMAN) | ||
| && (p.getAge() >= fromAge && p.getAge() <= femaleToAge))) | ||
|
Comment on lines
+72
to
+76
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Checklist violation: Use |
||
| .toList(); | ||
| } | ||
|
|
||
| /** | ||
|
|
@@ -59,7 +83,11 @@ public List<Person> getWorkablePeople(int fromAge, int femaleToAge, | |
| * return the names of all cats whose owners are women from `femaleAge` years old inclusively. | ||
| */ | ||
| public List<String> getCatsNames(List<Person> peopleList, int femaleAge) { | ||
| return Collections.emptyList(); | ||
| return peopleList.stream() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Checklist violation: Use |
||
| .filter(p -> p.getSex().equals(Person.Sex.WOMAN) && p.getAge() >= femaleAge) | ||
| .flatMap(p -> p.getCats().stream()) | ||
| .map(Cat::getName) | ||
| .toList(); | ||
| } | ||
|
|
||
| /** | ||
|
|
@@ -75,6 +103,10 @@ public List<String> getCatsNames(List<Person> peopleList, int femaleAge) { | |
| * parametrized with Candidate in CandidateValidator. | ||
| */ | ||
| public List<String> validateCandidates(List<Candidate> candidates) { | ||
| return Collections.emptyList(); | ||
| return candidates.stream() | ||
| .filter(new CandidateValidator()) | ||
| .map(Candidate::getName) | ||
| .sorted() | ||
| .toList(); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Checklist item #9 requires using constants for magic numbers/strings. The value
10for years lived should be defined as a constant instead of hardcoded.