2025 AP CSA FRQ 3 - Round (Solution + Scoring)
AP CSA 2025 FRQ 3: Round
Complete solution, scoring rubric breakdown, and walkthrough for the ArrayList construction and tournament pairing problem
| Topics Covered | ArrayList, Object construction, Constructors, Pairing algorithm |
| Skills Tested | Initializing an ArrayList from an array, Creating objects inside loops, Even/odd index logic |
| Difficulty | Medium-Hard |
| Recommended Time | 22 minutes |
What This Problem Asks
In 2025 AP CSA FRQ 3, students implement the Round class for a tournament bracket. Part A requires a constructor that converts a String[] of names into an ArrayList of Competitor objects with ranked positions. Part B requires a buildMatches method that pairs competitors from both ends of the list into Match objects, handling even and odd list sizes differently. This question tests ArrayList initialization, object construction inside loops, and an index-based pairing algorithm. FRQ 3 is typically where students encounter more algorithmic structure and multi-object reasoning than in the first two questions. On this page, you will find the complete Java solution, College Board scoring rubric breakdown, common mistakes to avoid, and links to the unit study guides behind the tested concepts.
What This FRQ Tests
This FRQ primarily tests concepts from Unit 4: Data Collections (ArrayList creation, traversal, and adding objects) and Unit 3: Class Creation (constructors, object instantiation, working with multiple interacting classes). Unit 4 accounts for 30–40% of the AP CSA exam.
Key skills tested: Initializing an ArrayList instance variable, constructing objects with specific parameters inside a loop, traversing a list from both ends, handling even/odd cases algorithmically.
Official Question + PDF Links
Read the complete question below, then scroll down for the solution and scoring breakdown.
Download Full FRQ PDF → Download Scoring Guidelines →
Your browser cannot display the embedded PDF. Open the PDF directly →
Strategy Video
Video Walkthrough: How to Think Through This FRQ
Watch this video before attempting the problem. It walks you through how to read the prompt, recognize the pattern, plan your approach, and dodge the most common traps — all without revealing the final code. Try the problem yourself after watching.
Provided Code
/** A single competitor in the tournament */
public class Competitor
{
private String name;
private int rank;
public Competitor(String n, int initialRank)
{ /* implementation not shown */ }
}
/** A match between two competitors */
public class Match
{
public Match(Competitor one, Competitor two)
{ /* implementation not shown */ }
}
/** A single round of the tournament */
public class Round
{
private ArrayList competitorList;
public Round(String[] names)
{ /* to be implemented in part (a) */ }
public ArrayList buildMatches()
{ /* to be implemented in part (b) */ }
}
Part A: Round Constructor — 4 points
Write the constructor for the Round class. Initialize competitorList to contain one Competitor object for each name in names. The order should match, and rank starts at 1 for the first name.
Constructor Signature:
public Round(String[] names)
Example
| Input | Result |
|---|---|
{"Alex", "Ben", "Cara"} |
competitorList contains: Competitor("Alex", 1), Competitor("Ben", 2), Competitor("Cara", 3) |
Write Your Solution
Scoring Rubric (Part A — 4 points)
| +1 | Accesses all elements of names (no bounds errors) |
| +1 | Initializes and maintains rank associated with each competitor, beginning at 1 |
| +1 | Constructs Competitor with provided name and computed rank |
| +1 | Adds all constructed competitors to competitorList in the correct order (algorithm) |
Solution
public Round(String[] names)
{
competitorList = new ArrayList();
for (int i = 0; i < names.length; i++)
{
Competitor c = new Competitor(names[i], i + 1);
competitorList.add(c);
}
}
Step-by-Step Explanation
Step 1: Initialize competitorList to a new, empty ArrayList. Do not redeclare with a type.
Step 2: Use a standard for loop with index i. You need the index for rank, so an enhanced for loop is less convenient.
Step 3: Construct each Competitor with names[i] and i + 1 as rank (starts at 1, not 0).
Step 4: Add each Competitor to competitorList. Iterating in order and adding to the end preserves order automatically.
Alternate Approach (Enhanced For with Counter)
public Round(String[] names)
{
competitorList = new ArrayList();
int rank = 1;
for (String name : names)
{
competitorList.add(new Competitor(name, rank));
rank++;
}
}
Part B: buildMatches — 5 points
Write buildMatches. Return a new ArrayList by pairing competitors:
- Even count: best with worst, second-best with second-worst, etc.
- Odd count: skip the best-ranked (index 0), pair the rest using the even rule.
Method Signature:
public ArrayList
Examples
Odd (3 competitors): [Alex(1), Ben(2), Cara(3)] → Skip Alex. Match(Ben, Cara).
Even (4 competitors): [Rei(1), Sam(2), Vi(3), Tim(4)] → Match(Rei, Tim) and Match(Sam, Vi).
Write Your Solution
Scoring Rubric (Part B — 5 points)
| +1 | Declares and initializes local ArrayList
|
| +1 | Initializes and maintains an index used to move from both ends of competitorList (algorithm) |
| +1 | Computes starting low index based on even/odd comparison |
| +1 | Gets two elements, constructs a Match, and adds it to the local list |
| +1 | Populates the list with the correct number of pairs, omitting the first competitor in the odd case, without bounds errors (algorithm) |
Solution
public ArrayListbuildMatches() { ArrayList matches = new ArrayList (); int low = 0; if (competitorList.size() % 2 == 1) { low = 1; } int high = competitorList.size() - 1; while (low < high) { Match m = new Match(competitorList.get(low), competitorList.get(high)); matches.add(m); low++; high--; } return matches; }
Step-by-Step Explanation
Step 1: Create a new, empty ArrayList.
Step 2: Set low to 0. If the list size is odd (% 2 == 1), set low to 1 to skip the best-ranked competitor at index 0.
Step 3: Set high to the last valid index: competitorList.size() - 1.
Step 4: Loop while (low < high). Each iteration pairs the competitor at low with the one at high, creates a new Match, adds it to matches, then moves both pointers inward.
Step 5: Return matches.
Alternate Approach (For Loop with Size/2)
public ArrayListbuildMatches() { ArrayList matches = new ArrayList (); if (competitorList.size() % 2 == 0) { for (int i = 0; i < competitorList.size() / 2; i++) { matches.add(new Match(competitorList.get(i), competitorList.get(competitorList.size() - i - 1))); } } else { for (int i = 1; i < competitorList.size() / 2 + 1; i++) { matches.add(new Match(competitorList.get(i), competitorList.get(competitorList.size() - i))); } } return matches; }
This is the College Board’s primary canonical solution. Both earn full credit.
Common Mistakes to Avoid
The constructor must initialize the instance variable, not a new local with the same name.
Wrong
ArrayListcompetitorList = new ArrayList ();
Correct
competitorList = new ArrayList();
Rank starts at 1, not 0. Using i directly is off by one.
Wrong
Competitor c = new Competitor(names[i], i);
Correct
Competitor c = new Competitor(names[i], i + 1);
When the count is odd, index 0 must be skipped. Always starting low at 0 creates too many matches or an incorrect pairing.
Wrong
int low = 0; // always starts at 0
Correct
int low = 0;
if (competitorList.size() % 2 == 1)
{
low = 1;
}
The postcondition says competitorList must be unchanged. Using remove() violates this.
Wrong
Competitor c1 = competitorList.remove(0);
Correct
Competitor c1 = competitorList.get(low);
Exam Tips for This FRQ
competitorList = ... without redeclaring the type.for loop (not enhanced) when you need the index for a computation like rank.get(), not remove().Scoring Summary
| Part | Method | Points |
|---|---|---|
| Part A |
Round constructor |
4 |
| Part B | buildMatches |
5 |
| Total | 9 |
Want the Complete 2025 FRQ Pack?
Get all 4 FRQs with detailed problem decomposition walkthroughs, scoring alignment, common mistake analysis, and partial credit strategies — in one downloadable PDF.
Includes deeper decomposition, partial-credit strategies, and printable walkthroughs beyond what is on this free page.
Related FRQs (Same Topic)
Array / ArrayList 2024 FRQ 3: WordChecker — ArrayList traversal with string comparison Array / ArrayList 2023 FRQ 3: WeatherData — ArrayList filtering and accumulation Array / ArrayList 2022 FRQ 3: ReviewAnalysis — ArrayList search with string matchingStudy the Concepts Behind This FRQ
This FRQ primarily tests Unit 4: Data Collections and Unit 3: Class Creation. Review the complete study guides to master ArrayList operations, object construction, and working with multiple interacting classes.
Read Unit 4 Study Guide → Read Unit 3 Study Guide →
Struggling with FRQs? Get 1-on-1 Help
Work directly with Tanner — AP CS teacher with 11+ years experience and 1,845+ verified tutoring hours. 54.5% of students score 5s (vs. 25.5% national average).
5-session packages available at $125/hr. Venmo, Zelle, PayPal, or credit card.
Frequently Asked Questions
What topics does 2025 AP CSA FRQ 3 test?
FRQ 3 tests ArrayList initialization and traversal, creating Competitor objects from array data with rank tracking, constructor writing, and a pairing algorithm with even/odd logic that builds Match objects from both ends of the list. It aligns with Unit 4 (Data Collections) and Unit 3 (Class Creation) in the 2025-2026 AP CSA curriculum.
How many points is 2025 FRQ 3 worth?
It is worth 9 points total: 4 points for Part A (Round constructor) and 5 points for Part B (buildMatches).
What is the most common mistake on this FRQ?
The most common mistake is redeclaring competitorList as a local variable inside the constructor instead of initializing the existing instance variable. Another frequent error is forgetting to skip the best-ranked competitor when the list size is odd.
How long should I spend on this FRQ during the exam?
Approximately 22 minutes. Part A (constructor) is straightforward — aim for about 7 minutes. Part B (buildMatches) requires careful even/odd logic, so budget about 15 minutes.
Which AP CSA unit does this FRQ align with?
This FRQ primarily aligns with Unit 4 (Data Collections) for ArrayList creation and traversal, and Unit 3 (Class Creation) for constructors and object instantiation. Unit 4 accounts for 30–40% of the AP CSA exam weight.
Where can I find more FRQs like this one?
Visit the FRQs by Topic page to find all Array/ArrayList questions from 2004–2025, or browse the complete FRQ Archive.
Get in Touch
Whether you're a student, parent, or teacher — I'd love to hear from you.
Just want free AP CS resources?
Enter your email below and check the subscribe box — no message needed. Students get daily practice questions and study tips. Teachers get curriculum resources and teaching strategies.
Message Sent!
Thanks for reaching out. I'll get back to you within 24 hours.
tanner@apcsexamprep.com
Courses
AP CSA, CSP, & Cybersecurity
Response Time
Within 24 hours
Prefer email? Reach me directly at tanner@apcsexamprep.com