Професионална програма
Loading...
+ Нов въпрос
petur_stoqnov avatar petur_stoqnov 28 Точки

5. Filter by Age / Functional Programming - Lab

Здравейте колеги,

Имам проблем с тази задача, мисля, че не разбирам добре условието, защото ми да дава грешки в judge. Моля който я е решил да изпрати решението си за да видя къде греша.

Условието е:

Write a program that reads an integer N on the first line. And on next N lines read pairs of "[name], [age]". Then read three more lines with:

⦁ Condition - "younger" or "older"

⦁ Age - Integer

⦁ Format - "name", "age" or "name age"

Depending on the condition, print the pairs in the right format.

Don’t use any build-in functionality. Write your own methods.

Examples:

Input Output Input Output Input output
5
Pesho, 20
Gosho, 18
Mimi, 29
Ico, 31
Simo, 16
older
20
name age
Pesho - 20
Mimi - 29
Ico - 31
5
Pesho, 20
Gosho, 18
Mimi, 29
Ico, 31
Simo, 16
younger
20
name
Pesho
Gosho
Simo
5
Pesho, 20
Gosho, 18
Mimi, 29
Ico, 31
Simo, 16
younger
50
age
20
18
29
31
16

 

 

Тагове:
0
Module: Java Advanced
MartinBG avatar MartinBG 3992 Точки

Ето едно решение от мен, като съм се постарал да използвам повече и по различен начин lambda функции и Stream API :

package demo;

import java.util.List;
import java.util.Objects;
import java.util.Scanner;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FilterByAge {

    public static void main(String[] args) {
        final Scanner scanner = new Scanner(System.in);

        IntFunction<String> consoleLineReader = ignored -> scanner.nextLine();

        List<Person> people = IntStream
                .range(0, Integer.parseInt(scanner.nextLine()))
                .mapToObj(consoleLineReader)
                .map(Person.STRING_TO_PERSON_FUNCTION)
                .collect(Collectors.toList());

        String condition = scanner.nextLine();
        int age = Integer.parseInt(scanner.nextLine());
        String format = scanner.nextLine();

        Function<Person, String> formatter = personFormatter(format);
        Predicate<Person> filter = ageComparator(condition, age);

        String result = people
                .stream()
                .filter(filter)
                .map(formatter)
                .collect(Collectors.joining(System.lineSeparator()));

        System.out.println(result);
    }

    private static Function<Person, String> personFormatter(String format) {
        switch (format) {
        case "name":
            return Person::getName;
        case "age":
            return person -> Integer.toString(person.getAge());
        case "name age":
            return person -> String.format("%s - %d", person.getName(), person.getAge());
        default:
            throw new IllegalArgumentException("Unknown format: " + format);
        }
    }

    private static Predicate<Person> ageComparator(String condition, int age) {
        switch (condition) {
        case "older":
            return person -> person.age >= age;
        case "younger":
            return person -> person.age <= age;
        default:
            throw new IllegalArgumentException("Unknown condition" + condition);
        }
    }

    private static final class Person {
        public static final Function<String, Person> STRING_TO_PERSON_FUNCTION = input -> {
            String[] tokens = Objects
                    .requireNonNull(input, "Null person input")
                    .split(", ");

            if (tokens.length != 2) {
                throw new IllegalArgumentException("Invalid person input: " + input);
            }

            String personName = tokens[0];
            int personAge = Integer.parseInt(tokens[1]);
            return new Person(personName, personAge);
        };

        private final String name;
        private final int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
    }
}

 

 

EDIT:

Ето още едно решение от времето, когато карах този модул: линк

0
13/05/2020 23:42:50
petur_stoqnov avatar petur_stoqnov 28 Точки

Много благодаря.

1
yanchev.ilian avatar yanchev.ilian 24 Точки

https://pastebin.com/6PWpyNrW - 100/100

Знам, че не е за този модул, но понеже няма такава дискусия в модул C# Advanced реших да пусна и едно решение на C# (използвал съм тюпъли).

 

https://pastebin.com/9wML43hx - 100/100

Тук вместо тюпъли съм изпозлвал отделен клас.

Надявам се да съм бил полезен за някого.

 

Поздрави,

Илиян Янчев

0
06/09/2021 17:44:28