2025 AP CSA FRQ 3 - Round (Solution + Scoring)

FRQ Archive2025 FRQs › FRQ 3: Round
2025 AP CSA • Array / ArrayList

AP CSA 2025 FRQ 3: Round

Complete solution, scoring rubric breakdown, and walkthrough for the ArrayList construction and tournament pairing problem

9 Points Medium-Hard Unit 4
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 →

Timer 22:00

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.

Subscribe for FRQ walkthroughs

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

Drag corner to expand ▽

 

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 buildMatches()

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

Drag corner to expand ▽

 

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 ArrayList buildMatches()
{
    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 ArrayList buildMatches()
{
    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

Redeclaring competitorList as a local variable

The constructor must initialize the instance variable, not a new local with the same name.

Wrong

ArrayList competitorList = new ArrayList();

Correct

competitorList = new ArrayList();
Using rank 0 instead of rank 1

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);
Not handling odd-sized lists in buildMatches

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;
}
Modifying competitorList instead of building a new list

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

When the problem says “initialize an instance variable,” write competitorList = ... without redeclaring the type.
Use a standard for loop (not enhanced) when you need the index for a computation like rank.
Read postconditions carefully. “competitorList is unchanged” means use get(), not remove().
The two-pointer pattern (low/high moving inward) appears in many ArrayList FRQs. Practice recognizing it.
Even if your Part A is wrong, Part B is graded assuming Part A works correctly. Always attempt both parts.

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.

Get the 2025 FRQ Pack →

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 matching

Study 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.0Rating (451+ reviews)
1,845+Verified Hours
54.5%Score 5s

Book a Session ($150/hr) →

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.

Typically responds within 24 hours

Message Sent!

Thanks for reaching out. I'll get back to you within 24 hours.

🏫 Welcome, fellow educator!

I offer curriculum resources, practice materials, and study guides designed for AP CS teachers. Let me know what you're looking for — whether it's classroom materials, a guest speaker, or Teachers Pay Teachers resources.

Email

tanner@apcsexamprep.com

📚

Courses

AP CSA, CSP, & Cybersecurity

Response Time

Within 24 hours

Prefer email? Reach me directly at tanner@apcsexamprep.com