Loading...
tripTiPscout avatar tripTiPscout 24 Точки

Задача 04. Teamwork projects (Objects and Classes - More Exercise) Java Fundamentals

Здравейте, имам затруднение с добавянето на член в отбор след като е минала проверката за съществуващ отбор или член. Не успявам да добавя нов член в конкретния отбор. Някъде нещо изпускам. Нещо при списъка от членове на конкретния отбор. До момента добавях членове в спиъка с такива и те отиваха във всички отбори, а не в конкретен такъв. Може ли някой да проследи моята логика и да ме насочи?

Условие:

Teamwork Projects

It's time for teamwork projects and you are responsible for making the teams. First you will receive an integer - the count of the teams you will have to register. You will be given a user and a team (separated with “-”).  The user is the creator of that team.

For every newly created team you should print a message:

"Team {team Name} has been created by {user}!".

Next you will receive user with team (separated with "->") which means that the user wants to join that team. Upon receiving the command: “end of assignment”, you should print every team, ordered by the count of its members (descending) and then by name (ascending). For each team (disband teams as well), you have to print its members sorted by name (ascending). However, there are several rules:

  1. If user tries to create a team more than once a message should be displayed:
    • "Team {teamName} was already created!"
  2. Creator of a team cannot create another team - message should be thrown:
    • "{user} cannot create another team!"
  3. If user tries to join currently non-existing team a message should be displayed:
    • "Team {teamName} does not exist!"
  4. Member of a team cannot join another team - message should be thrown:
    • "Member {user} cannot join team {team Name}!"
  5. In the end (after teams' report) teams with zero members (with only a creator) should disband ordered by name in ascending other.
  6.  Every valid team should be printed ordered by name (ascending) in this format:

"{teamName}:

- {creator}

-- {member}…"

 

 

input:

2

Didi-PowerPuffsCoders

Toni-Toni is the best

Petq->PowerPuffsCoders

Toni->Toni is the best

end of assignment

 

3

Tatyana-CloneClub

Helena-CloneClub

Trifon-AiNaBira

Pesho->aiNaBira

Pesho->AiNaBira

Tatyana->Leda

PeshO->AiNaBira

Cossima->CloneClub

end of assignment

 

Задачата ми не е довършена, но имам нужда само от конкретната помощ, по логиката, която следвам. Ако нещо в подхода ми не е правилно, ще се радвам да ме осветлите. Благодаря предварително!

judge: https://judge.softuni.org/Contests/Practice/Index/1328#3

pastebin my code (TeamworkProjects (Main) class + Team class): https://pastebin.com/qzMm755T

Тагове:
0
Fundamentals Module
MartinBG avatar MartinBG 4803 Точки
Best Answer

Няколко насоки:

1. Премахнете List<String> members = new ArrayList<>(); - излишен е, а и начинът по който го ползвате в програмата е грешен (всички отбори ще използват един и същ списък с участници)

2. teams.toString().contains(team) далеч не е най-добрият начин за проверка дали даден Team вече съществува. Използвайте Stream API или си напишете помощен метод, който получава List<Team>  и String и връща булева стойност ако някой от отборите вече има такова име

3. За добавяне на нов участник към отбор най-добре си направете метод в Team класа: addMemeber(String memberName)

4. Премахнете всички гетъри и сетъри от Team класа, с изключение на тези, които наистина са необходими за задачата. Експоузването на съдържанието на клас по този начин  никога не е било и няма да бъде добра практика, така че не се учете да го правите. ;)

1
tripTiPscout avatar tripTiPscout 24 Точки

От това имах нужада! Много Благодаря!!!

1
tripTiPscout avatar tripTiPscout 24 Точки

@MartinBG

Здравейте отново!

Направих каквото ме посъветвахте и мисля, че се получи, макар един от тестовете в judge да не минава :(

https://pastebin.com/WzZ2SDbB

Не използвах Stream API, защото все още не съм го учил, а за другите насоки, които ми дадехте, бяхте много прав.

Махнах списъка от Main класа, защото наистина не работеше, както отбелязахте.

Гетърите и сетърите в Team класа ги бях оставил, защото ползвах различни варианти за решение, но определено вашето мнение много ми помогна.

Благодаря още веднъж!

1
MartinBG avatar MartinBG 4803 Точки

Виждам две грешки, поради които може да не минава решението.

1. Може да се създаде нов отбор от участник, който вече е създал друг отбор:

            if (isTeamExist(teams, team)) {
                teams.add(newTeam); // тук липсва проверката за създателя
                System.out.printf("Team %s has been created by %s!\n", team, creator);
            } else {
                for (Team currentTeam : teams) {
                    if (currentTeam.getName().equals(team)) {
                        System.out.printf("Team %s was already created!\n", team);
                    } else if (currentTeam.getCreator().equals(creator)) {
                        System.out.printf("%s cannot create another team!\n", creator);
                    }
                }
            }

Може да решите проблема примерно с нов метод (bool canCreateTeam(teams, creatorName), който извиквате в if/else if/else конструкция

 

2. Сортирането не е правилно конструирано - има две отделни и независими една от друга части:

        teams.sort(Comparator.comparing(Team::getName));
        teams.sort(Comparator.comparing(Team::membersCount).reversed());

Трябва да е примерно така:

        teams.sort(Comparator.comparing(Team::getName)
                .thenComparing(Comparator.comparingInt(Team::membersCount).reversed()));

 

 

Набързо няколко коментара по кода:

- isTeamExist в момента прави обратното на това, което твърди името ѝ (връща true за несъществуващ отбор и false за съществуващ)

- на много места в кода търсите отбор по име (for (Team team : teams) { if (team.getName().equals(teamToJoin))). Много по-удобно ще е ако пазите отборите в Map<String, Team>

- в Team класа getMembers() метода връща референция към members, което е опасно (някой може да ги модифицира отвън например). Трябва да върнете unmodifiableList или дори unmodifiableCollection

- части от кода в main могат да се изнесат като методи - например прочитането на входните данни и извеждането на резултата

1
23/05/2022 22:23:08
tripTiPscout avatar tripTiPscout 24 Точки

@MartinBG

Да, грешката идваше от отва, че може да се създаде нов отбор от участник, който вече е създал друг отбор.

Добавих в проверката вече написаният метод за проверка дали даден член на отбор съществува и готово.

Направих и корекция при сортирането, но в judge ми даде грешка на първия тест, макар че вашият подход ми се струва правилен, тъй като прави две последователни сортировки.

Метода isTeamExist беше ок, но IDE-то ме посъветва да го обърна, защото и двата пъти, в които го извиквах беше с отрицание. Направих го, но забравих да му сменя името.

Защитих масива с метода unmodifiableList(), както ме посъветвахте.

И в крайна сметка взех 100/100 точки благодарение на вас.

Уви, направих няколко опита с map, но много обърках кода.

Ще се запозная по подробно с употребата на този вид масиви, защото не можах да извикам полетата на класа Team. Не намерих начин да обходя списъка с членовете и да правя проверки, дали в Map-а се съдържат конкретни стойности.

Бих желал да видя, как би могло да стане в тази задача, но ми помогнахте много и не искам да злоупотребявам.

Благодаря!

2
25/05/2022 16:10:50
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.