[{"data":1,"prerenderedAt":3148},["ShallowReactive",2],{"item-lessons-light-ch09-storing-data":3,"item-examples-light-ch09-storing-data":444,"item-exercises-light-ch09-storing-data":753,"item-lesson-full-ch09-storing-data-9.8":1070,"item-example-full-ch09-storing-data-9.8":1573,"item-exercise-full-ch09-storing-data-9.8":2010},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":606,"title":607,"stem":608},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":763,"title":764,"stem":765},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":767,"title":768,"stem":769},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":771,"title":772,"stem":773},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":775,"title":776,"stem":777},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":779,"title":780,"stem":781},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":783,"title":784,"stem":785},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":787,"title":788,"stem":789},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":791,"title":792,"stem":793},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":795,"title":796,"stem":797},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":799,"title":800,"stem":801},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":803,"title":804,"stem":805},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":807,"title":808,"stem":809},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":811,"title":812,"stem":813},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":815,"title":816,"stem":817},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":843,"title":844,"stem":845},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":847,"title":848,"stem":849},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":871,"title":872,"stem":873},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":875,"title":876,"stem":877},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":879,"title":880,"stem":881},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":883,"title":884,"stem":885},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":887,"title":888,"stem":889},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":891,"title":892,"stem":893},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":915,"title":916,"stem":917},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":170,"body":1072,"description":1116,"extension":1567,"meta":1568,"navigation":1138,"path":169,"seo":1571,"stem":171,"__hash__":1572},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files.md",{"type":1073,"value":1074,"toc":1557},"minimark",[1075,1079,1084,1088,1092,1110,1152,1186,1211,1253,1257,1290,1300,1304,1319,1354,1371,1375,1382,1409,1413,1419,1451,1455,1498,1502,1542,1553],[1076,1077,170],"h1",{"id":1078},"using-text-files",[1080,1081,1083],"h2",{"id":1082},"why-read-from-a-file","Why Read From a File",[1085,1086,1087],"p",{},"A file's data persists even when the program isn't running — useful for loading configuration or data that's too large (or too changeable) to hard-code into your source. A robot might load a table of autonomous starting positions from a file instead of hardcoding them.",[1080,1089,1091],{"id":1090},"opening-a-file","Opening a File",[1085,1093,1094,1098,1099,1102,1103,1098,1106,1109],{},[1095,1096,1097],"code",{},"File"," (from ",[1095,1100,1101],{},"java.io",") represents the file itself — really just a filename\u002Fpath, and building one never fails even if the file doesn't exist. ",[1095,1104,1105],{},"Scanner",[1095,1107,1108],{},"java.util",") is what actually reads from it:",[1111,1112,1117],"pre",{"className":1113,"code":1114,"language":1115,"meta":1116,"style":1116},"language-java shiki shiki-themes github-light github-dark","import java.io.*;\nimport java.util.*;\n\nFile configFile = new File(\"auto_config.csv\"); \u002F\u002F just a name — this line can't fail\nScanner scan = new Scanner(configFile); \u002F\u002F this line can throw FileNotFoundException\n","java","",[1095,1118,1119,1127,1133,1140,1146],{"__ignoreMap":1116},[1120,1121,1124],"span",{"class":1122,"line":1123},"line",1,[1120,1125,1126],{},"import java.io.*;\n",[1120,1128,1130],{"class":1122,"line":1129},2,[1120,1131,1132],{},"import java.util.*;\n",[1120,1134,1136],{"class":1122,"line":1135},3,[1120,1137,1139],{"emptyLinePlaceholder":1138},true,"\n",[1120,1141,1143],{"class":1122,"line":1142},4,[1120,1144,1145],{},"File configFile = new File(\"auto_config.csv\"); \u002F\u002F just a name — this line can't fail\n",[1120,1147,1149],{"class":1122,"line":1148},5,[1120,1150,1151],{},"Scanner scan = new Scanner(configFile); \u002F\u002F this line can throw FileNotFoundException\n",[1085,1153,1154,1157,1158,1161,1162,1164,1165,1168,1169,1171,1172,1168,1174,1176,1177,1180,1181,1185],{},[1095,1155,1156],{},"import java.io.*;"," and ",[1095,1159,1160],{},"import java.util.*;"," are wildcard imports (Ch.3.3) — they pull in every class from that package (",[1095,1163,1097],{},"\u002F",[1095,1166,1167],{},"IOException"," from ",[1095,1170,1101],{},"; ",[1095,1173,1105],{},[1095,1175,1108],{},") instead of naming each one individually. A relative filename like ",[1095,1178,1179],{},"\"auto_config.csv\""," is looked up relative to wherever the program is ",[1182,1183,1184],"em",{},"run"," from, not where the source file lives.",[1085,1187,1188,1189,1192,1193,1164,1196,1199,1200,1203,1204,1206,1207,1210],{},"Since opening a file can fail (wrong name, missing file), Java requires you to acknowledge that. The simplest way: add ",[1095,1190,1191],{},"throws IOException"," to the method's header — if the file genuinely can't be found, the program terminates with an error instead of continuing silently. (",[1095,1194,1195],{},"try",[1095,1197,1198],{},"catch",", the alternative to ",[1095,1201,1202],{},"throws",", is Ch.12's subject — including ",[1095,1205,1195],{},"-with-resources, which can close the scanner automatically instead of a manual ",[1095,1208,1209],{},"scan.close()",".)",[1111,1212,1214],{"className":1113,"code":1213,"language":1115,"meta":1116,"style":1116},"public static void main(String[] args) throws IOException\n{\n    File configFile = new File(\"auto_config.csv\");\n    Scanner scan = new Scanner(configFile);\n    \u002F\u002F ...\n    scan.close();\n}\n",[1095,1215,1216,1221,1226,1231,1236,1241,1247],{"__ignoreMap":1116},[1120,1217,1218],{"class":1122,"line":1123},[1120,1219,1220],{},"public static void main(String[] args) throws IOException\n",[1120,1222,1223],{"class":1122,"line":1129},[1120,1224,1225],{},"{\n",[1120,1227,1228],{"class":1122,"line":1135},[1120,1229,1230],{},"    File configFile = new File(\"auto_config.csv\");\n",[1120,1232,1233],{"class":1122,"line":1142},[1120,1234,1235],{},"    Scanner scan = new Scanner(configFile);\n",[1120,1237,1238],{"class":1122,"line":1148},[1120,1239,1240],{},"    \u002F\u002F ...\n",[1120,1242,1244],{"class":1122,"line":1243},6,[1120,1245,1246],{},"    scan.close();\n",[1120,1248,1250],{"class":1122,"line":1249},7,[1120,1251,1252],{},"}\n",[1080,1254,1256],{"id":1255},"reading-line-by-line","Reading Line by Line",[1111,1258,1260],{"className":1113,"code":1259,"language":1115,"meta":1116,"style":1116},"while (scan.hasNextLine())\n{\n    String line = scan.nextLine();\n    \u002F\u002F process this line\n}\nscan.close(); \u002F\u002F always close when done\n",[1095,1261,1262,1267,1271,1276,1281,1285],{"__ignoreMap":1116},[1120,1263,1264],{"class":1122,"line":1123},[1120,1265,1266],{},"while (scan.hasNextLine())\n",[1120,1268,1269],{"class":1122,"line":1129},[1120,1270,1225],{},[1120,1272,1273],{"class":1122,"line":1135},[1120,1274,1275],{},"    String line = scan.nextLine();\n",[1120,1277,1278],{"class":1122,"line":1142},[1120,1279,1280],{},"    \u002F\u002F process this line\n",[1120,1282,1283],{"class":1122,"line":1148},[1120,1284,1252],{},[1120,1286,1287],{"class":1122,"line":1243},[1120,1288,1289],{},"scan.close(); \u002F\u002F always close when done\n",[1085,1291,1292,1295,1296,1299],{},[1095,1293,1294],{},"hasNextLine()"," is ",[1095,1297,1298],{},"true"," as long as there's another line to read — the standard loop condition for \"read until the file ends.\"",[1080,1301,1303],{"id":1302},"splitting-a-csv-line","Splitting a CSV Line",[1085,1305,1306,1307,1310,1311,1314,1315,1318],{},"A CSV (comma-separated values) file packs several fields into one line. ",[1095,1308,1309],{},"String","'s ",[1095,1312,1313],{},"split(\",\")"," breaks a line into a ",[1095,1316,1317],{},"String[]"," around the commas:",[1111,1320,1322],{"className":1113,"code":1321,"language":1115,"meta":1116,"style":1116},"\u002F\u002F One line of auto_config.csv: \"3-Piece-Left,14.2,BlueAlliance\"\nString line = scan.nextLine();\nString[] fields = line.split(\",\");\nString routeName = fields[0];       \u002F\u002F \"3-Piece-Left\"\ndouble routeTime = Double.parseDouble(fields[1]); \u002F\u002F \"14.2\" -> 14.2\nString alliance = fields[2];        \u002F\u002F \"BlueAlliance\"\n",[1095,1323,1324,1329,1334,1339,1344,1349],{"__ignoreMap":1116},[1120,1325,1326],{"class":1122,"line":1123},[1120,1327,1328],{},"\u002F\u002F One line of auto_config.csv: \"3-Piece-Left,14.2,BlueAlliance\"\n",[1120,1330,1331],{"class":1122,"line":1129},[1120,1332,1333],{},"String line = scan.nextLine();\n",[1120,1335,1336],{"class":1122,"line":1135},[1120,1337,1338],{},"String[] fields = line.split(\",\");\n",[1120,1340,1341],{"class":1122,"line":1142},[1120,1342,1343],{},"String routeName = fields[0];       \u002F\u002F \"3-Piece-Left\"\n",[1120,1345,1346],{"class":1122,"line":1148},[1120,1347,1348],{},"double routeTime = Double.parseDouble(fields[1]); \u002F\u002F \"14.2\" -> 14.2\n",[1120,1350,1351],{"class":1122,"line":1243},[1120,1352,1353],{},"String alliance = fields[2];        \u002F\u002F \"BlueAlliance\"\n",[1085,1355,1356,1164,1359,1362,1363,1366,1367,1370],{},[1095,1357,1358],{},"Integer.parseInt",[1095,1360,1361],{},"Double.parseDouble"," convert text into a number — Ch.9.2 covers the wrapper classes (",[1095,1364,1365],{},"Integer",", ",[1095,1368,1369],{},"Double",") these belong to.",[1080,1372,1374],{"id":1373},"reading-into-an-array-or-arraylist","Reading Into an Array or ArrayList",[1085,1376,1377,1378,1381],{},"If you know the line count in advance, an array works; otherwise, ",[1095,1379,1380],{},"ArrayList"," (Ch.9.2) avoids needing to know the size up front:",[1111,1383,1385],{"className":1113,"code":1384,"language":1115,"meta":1116,"style":1116},"ArrayList\u003CString> configLines = new ArrayList\u003CString>();\nwhile (scan.hasNextLine())\n{\n    configLines.add(scan.nextLine());\n}\n",[1095,1386,1387,1392,1396,1400,1405],{"__ignoreMap":1116},[1120,1388,1389],{"class":1122,"line":1123},[1120,1390,1391],{},"ArrayList\u003CString> configLines = new ArrayList\u003CString>();\n",[1120,1393,1394],{"class":1122,"line":1129},[1120,1395,1266],{},[1120,1397,1398],{"class":1122,"line":1135},[1120,1399,1225],{},[1120,1401,1402],{"class":1122,"line":1142},[1120,1403,1404],{},"    configLines.add(scan.nextLine());\n",[1120,1406,1407],{"class":1122,"line":1148},[1120,1408,1252],{},[1080,1410,1412],{"id":1411},"reading-into-objects","Reading Into Objects",[1085,1414,1415,1416,1418],{},"Rather than working with raw ",[1095,1417,1317],{}," rows, define a class matching the file's columns and build one object per row — the same has-a\u002Fobject-per-record idea from Ch.7:",[1111,1420,1422],{"className":1113,"code":1421,"language":1115,"meta":1116,"style":1116},"ArrayList\u003CAutoRoute> routes = new ArrayList\u003CAutoRoute>();\nwhile (scan.hasNextLine())\n{\n    String[] fields = scan.nextLine().split(\",\");\n    routes.add(new AutoRoute(fields[0], Double.parseDouble(fields[1]), fields[2]));\n}\n",[1095,1423,1424,1429,1433,1437,1442,1447],{"__ignoreMap":1116},[1120,1425,1426],{"class":1122,"line":1123},[1120,1427,1428],{},"ArrayList\u003CAutoRoute> routes = new ArrayList\u003CAutoRoute>();\n",[1120,1430,1431],{"class":1122,"line":1129},[1120,1432,1266],{},[1120,1434,1435],{"class":1122,"line":1135},[1120,1436,1225],{},[1120,1438,1439],{"class":1122,"line":1142},[1120,1440,1441],{},"    String[] fields = scan.nextLine().split(\",\");\n",[1120,1443,1444],{"class":1122,"line":1148},[1120,1445,1446],{},"    routes.add(new AutoRoute(fields[0], Double.parseDouble(fields[1]), fields[2]));\n",[1120,1448,1449],{"class":1122,"line":1243},[1120,1450,1252],{},[1080,1452,1454],{"id":1453},"common-pitfalls","Common Pitfalls",[1456,1457,1458,1469,1479,1489],"ul",{},[1459,1460,1461,1468],"li",{},[1462,1463,1464,1465,1467],"strong",{},"Forgetting ",[1095,1466,1191],{}," (or a try\u002Fcatch)."," Java won't compile file-reading code unless you've acknowledged that opening the file might fail.",[1459,1470,1471,1478],{},[1462,1472,1473,1474,1477],{},"Forgetting to ",[1095,1475,1476],{},"close()"," the scanner."," A small leak that adds up in a program that opens many files.",[1459,1480,1481,1484,1485,1488],{},[1462,1482,1483],{},"Trying to parse a header row as data."," The first line of a CSV is often column names, not values — call ",[1095,1486,1487],{},"scan.nextLine()"," once before the loop starts to discard it, rather than checking for it on every pass.",[1459,1490,1491,1494,1495,1497],{},[1462,1492,1493],{},"Assuming a relative filename resolves next to the source file."," It resolves relative to wherever the program is actually ",[1182,1496,1184],{}," from, which isn't always the same folder.",[1080,1499,1501],{"id":1500},"key-takeaways","Key Takeaways",[1456,1503,1504,1519,1528,1539],{},[1459,1505,1506,1508,1509,1511,1512,1515,1516,1518],{},[1095,1507,1097],{}," just represents a filename and never throws; ",[1095,1510,1105],{}," is what can throw (",[1095,1513,1514],{},"FileNotFoundException",") when it actually tries to open that file — Java requires you to acknowledge that (",[1095,1517,1191],{},", or try\u002Fcatch).",[1459,1520,1521,1523,1524,1527],{},[1095,1522,1294],{}," combined with a ",[1095,1525,1526],{},"while"," loop is the standard pattern for reading an entire file, line by line.",[1459,1529,1530,1533,1534,1164,1536,1538],{},[1095,1531,1532],{},"String.split(\",\")"," breaks a CSV line into fields; ",[1095,1535,1358],{},[1095,1537,1361],{}," (Ch.9.2) convert a field's text into a number.",[1459,1540,1541],{},"Reading rows into custom objects (one object per line) is cleaner than working with raw split arrays once the data has real structure.",[1085,1543,1544,1545,1548,1549,1552],{},"Derived from ",[1095,1546,1547],{},"csawesome-2026",": ",[1095,1550,1551],{},"unit-4-data-collections\u002F4.06-using-text-files.md"," (CSA 4.6)",[1554,1555,1556],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1116,"searchDepth":1129,"depth":1129,"links":1558},[1559,1560,1561,1562,1563,1564,1565,1566],{"id":1082,"depth":1129,"text":1083},{"id":1090,"depth":1129,"text":1091},{"id":1255,"depth":1129,"text":1256},{"id":1302,"depth":1129,"text":1303},{"id":1373,"depth":1129,"text":1374},{"id":1411,"depth":1129,"text":1412},{"id":1453,"depth":1129,"text":1454},{"id":1500,"depth":1129,"text":1501},"md",{"outlineRef":1569,"status":1570},"9.8 — Using Text Files (CSA 4.6)","new — authored lesson (fuller depth than the teaser slide)",{"title":170,"description":1116},"L8x4wy75y5rtXfri7fsrNJoSp9nFjlIjP0o56-G_rKw",{"id":1574,"title":607,"body":1575,"description":1116,"extension":1567,"meta":2005,"navigation":1138,"path":606,"seo":2008,"stem":608,"__hash__":2009},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files.md",{"type":1073,"value":1576,"toc":1992},[1577,1580,1584,1591,1597,1605,1609,1630,1636,1642,1742,1746,1756,1803,1807,1816,1825,1831,1838,1901,1906,1910,1919,1925,1929,1952,1958,1962,1990],[1076,1578,607],{"id":1579},"using-text-files-worked-example",[1080,1581,1583],{"id":1582},"problem","Problem",[1085,1585,1586,1587,1590],{},"Read a CSV file of this weekend's practice-match results — one row per match, with a header row — into a list of ",[1095,1588,1589],{},"MatchResult"," objects, then print each one.",[1085,1592,1593,1596],{},[1095,1594,1595],{},"practice_scores.csv",":",[1111,1598,1603],{"className":1599,"code":1601,"language":1602},[1600],"language-text","matchNumber,score,opponent\n1,38.0,IronClad\n2,45.5,Voltage Vipers\n3,52.0,Circuit Breakers\n","text",[1095,1604,1601],{"__ignoreMap":1116},[1080,1606,1608],{"id":1607},"step-1-plan-it-first","Step 1: Plan It First",[1610,1611,1612,1615,1618,1621,1627],"ol",{},[1459,1613,1614],{},"Open the file.",[1459,1616,1617],{},"Skip the header row.",[1459,1619,1620],{},"Read each remaining row and split it into fields.",[1459,1622,1623,1624,1626],{},"Build one ",[1095,1625,1589],{}," object per row.",[1459,1628,1629],{},"Close the file, then print the results.",[1080,1631,1633,1634],{"id":1632},"step-2-define-matchresult","Step 2: Define ",[1095,1635,1589],{},[1085,1637,1638,1639,1641],{},"Rather than juggling raw ",[1095,1640,1317],{}," rows everywhere, one object per record keeps the three related fields together:",[1111,1643,1645],{"className":1113,"code":1644,"language":1115,"meta":1116,"style":1116},"public class MatchResult\n{\n    private int matchNumber;\n    private double score;\n    private String opponent;\n\n    public MatchResult(int matchNumber, double score, String opponent)\n    {\n        this.matchNumber = matchNumber;\n        this.score = score;\n        this.opponent = opponent;\n    }\n\n    public String toString()\n    {\n        return \"Match \" + matchNumber + \": \" + score + \" vs \" + opponent;\n    }\n}\n",[1095,1646,1647,1652,1656,1661,1666,1671,1675,1680,1686,1692,1698,1704,1710,1715,1721,1726,1732,1737],{"__ignoreMap":1116},[1120,1648,1649],{"class":1122,"line":1123},[1120,1650,1651],{},"public class MatchResult\n",[1120,1653,1654],{"class":1122,"line":1129},[1120,1655,1225],{},[1120,1657,1658],{"class":1122,"line":1135},[1120,1659,1660],{},"    private int matchNumber;\n",[1120,1662,1663],{"class":1122,"line":1142},[1120,1664,1665],{},"    private double score;\n",[1120,1667,1668],{"class":1122,"line":1148},[1120,1669,1670],{},"    private String opponent;\n",[1120,1672,1673],{"class":1122,"line":1243},[1120,1674,1139],{"emptyLinePlaceholder":1138},[1120,1676,1677],{"class":1122,"line":1249},[1120,1678,1679],{},"    public MatchResult(int matchNumber, double score, String opponent)\n",[1120,1681,1683],{"class":1122,"line":1682},8,[1120,1684,1685],{},"    {\n",[1120,1687,1689],{"class":1122,"line":1688},9,[1120,1690,1691],{},"        this.matchNumber = matchNumber;\n",[1120,1693,1695],{"class":1122,"line":1694},10,[1120,1696,1697],{},"        this.score = score;\n",[1120,1699,1701],{"class":1122,"line":1700},11,[1120,1702,1703],{},"        this.opponent = opponent;\n",[1120,1705,1707],{"class":1122,"line":1706},12,[1120,1708,1709],{},"    }\n",[1120,1711,1713],{"class":1122,"line":1712},13,[1120,1714,1139],{"emptyLinePlaceholder":1138},[1120,1716,1718],{"class":1122,"line":1717},14,[1120,1719,1720],{},"    public String toString()\n",[1120,1722,1724],{"class":1122,"line":1723},15,[1120,1725,1685],{},[1120,1727,1729],{"class":1122,"line":1728},16,[1120,1730,1731],{},"        return \"Match \" + matchNumber + \": \" + score + \" vs \" + opponent;\n",[1120,1733,1735],{"class":1122,"line":1734},17,[1120,1736,1709],{},[1120,1738,1740],{"class":1122,"line":1739},18,[1120,1741,1252],{},[1080,1743,1745],{"id":1744},"step-3-open-the-file","Step 3: Open the File",[1085,1747,1748,1750,1751,1753,1754,1596],{},[1095,1749,1097],{}," represents the file itself; ",[1095,1752,1105],{}," reads from it. Opening a file can fail, so the method needs ",[1095,1755,1191],{},[1111,1757,1759],{"className":1113,"code":1758,"language":1115,"meta":1116,"style":1116},"import java.io.*;\nimport java.util.*;\n\npublic static void main(String[] args) throws IOException\n{\n    File scoresFile = new File(\"practice_scores.csv\");\n    Scanner scan = new Scanner(scoresFile);\n\n    \u002F\u002F ...\n}\n",[1095,1760,1761,1765,1769,1773,1777,1781,1786,1791,1795,1799],{"__ignoreMap":1116},[1120,1762,1763],{"class":1122,"line":1123},[1120,1764,1126],{},[1120,1766,1767],{"class":1122,"line":1129},[1120,1768,1132],{},[1120,1770,1771],{"class":1122,"line":1135},[1120,1772,1139],{"emptyLinePlaceholder":1138},[1120,1774,1775],{"class":1122,"line":1142},[1120,1776,1220],{},[1120,1778,1779],{"class":1122,"line":1148},[1120,1780,1225],{},[1120,1782,1783],{"class":1122,"line":1243},[1120,1784,1785],{},"    File scoresFile = new File(\"practice_scores.csv\");\n",[1120,1787,1788],{"class":1122,"line":1249},[1120,1789,1790],{},"    Scanner scan = new Scanner(scoresFile);\n",[1120,1792,1793],{"class":1122,"line":1682},[1120,1794,1139],{"emptyLinePlaceholder":1138},[1120,1796,1797],{"class":1122,"line":1688},[1120,1798,1240],{},[1120,1800,1801],{"class":1122,"line":1694},[1120,1802,1252],{},[1080,1804,1806],{"id":1805},"step-4-skip-the-header-row","Step 4: Skip the Header Row",[1085,1808,1809,1810,1812,1813,1596],{},"The first line is column names, not data — reading it as a row would crash when ",[1095,1811,1361],{}," hit the text ",[1095,1814,1815],{},"\"score\"",[1111,1817,1819],{"className":1113,"code":1818,"language":1115,"meta":1116,"style":1116},"scan.nextLine(); \u002F\u002F discards \"matchNumber,score,opponent\"\n",[1095,1820,1821],{"__ignoreMap":1116},[1120,1822,1823],{"class":1122,"line":1123},[1120,1824,1818],{},[1080,1826,1828,1829],{"id":1827},"step-5-read-each-remaining-row-into-a-matchresult","Step 5: Read Each Remaining Row Into a ",[1095,1830,1589],{},[1085,1832,1833,1523,1835,1837],{},[1095,1834,1294],{},[1095,1836,1526],{}," loop reads until the file ends; each line is split on commas into fields:",[1111,1839,1841],{"className":1113,"code":1840,"language":1115,"meta":1116,"style":1116},"ArrayList\u003CMatchResult> results = new ArrayList\u003CMatchResult>();\n\nwhile (scan.hasNextLine())\n{\n    String line = scan.nextLine();\n    String[] fields = line.split(\",\");\n\n    int matchNumber = Integer.parseInt(fields[0]);\n    double score = Double.parseDouble(fields[1]);\n    String opponent = fields[2];\n\n    results.add(new MatchResult(matchNumber, score, opponent));\n}\n",[1095,1842,1843,1848,1852,1856,1860,1864,1869,1873,1878,1883,1888,1892,1897],{"__ignoreMap":1116},[1120,1844,1845],{"class":1122,"line":1123},[1120,1846,1847],{},"ArrayList\u003CMatchResult> results = new ArrayList\u003CMatchResult>();\n",[1120,1849,1850],{"class":1122,"line":1129},[1120,1851,1139],{"emptyLinePlaceholder":1138},[1120,1853,1854],{"class":1122,"line":1135},[1120,1855,1266],{},[1120,1857,1858],{"class":1122,"line":1142},[1120,1859,1225],{},[1120,1861,1862],{"class":1122,"line":1148},[1120,1863,1275],{},[1120,1865,1866],{"class":1122,"line":1243},[1120,1867,1868],{},"    String[] fields = line.split(\",\");\n",[1120,1870,1871],{"class":1122,"line":1249},[1120,1872,1139],{"emptyLinePlaceholder":1138},[1120,1874,1875],{"class":1122,"line":1682},[1120,1876,1877],{},"    int matchNumber = Integer.parseInt(fields[0]);\n",[1120,1879,1880],{"class":1122,"line":1688},[1120,1881,1882],{},"    double score = Double.parseDouble(fields[1]);\n",[1120,1884,1885],{"class":1122,"line":1694},[1120,1886,1887],{},"    String opponent = fields[2];\n",[1120,1889,1890],{"class":1122,"line":1700},[1120,1891,1139],{"emptyLinePlaceholder":1138},[1120,1893,1894],{"class":1122,"line":1706},[1120,1895,1896],{},"    results.add(new MatchResult(matchNumber, score, opponent));\n",[1120,1898,1899],{"class":1122,"line":1712},[1120,1900,1252],{},[1085,1902,1903,1905],{},[1095,1904,1380],{}," is used here rather than an array because the number of matches isn't known in advance — it's however many rows the file happens to have.",[1080,1907,1909],{"id":1908},"step-6-close-the-file","Step 6: Close the File",[1111,1911,1913],{"className":1113,"code":1912,"language":1115,"meta":1116,"style":1116},"scan.close();\n",[1095,1914,1915],{"__ignoreMap":1116},[1120,1916,1917],{"class":1122,"line":1123},[1120,1918,1912],{},[1085,1920,1921,1922,1924],{},"Always close a ",[1095,1923,1105],{}," once done reading — a small leak that adds up in a program that opens many files.",[1080,1926,1928],{"id":1927},"step-7-print-the-results","Step 7: Print the Results",[1111,1930,1932],{"className":1113,"code":1931,"language":1115,"meta":1116,"style":1116},"for (MatchResult result : results)\n{\n    System.out.println(result);\n}\n",[1095,1933,1934,1939,1943,1948],{"__ignoreMap":1116},[1120,1935,1936],{"class":1122,"line":1123},[1120,1937,1938],{},"for (MatchResult result : results)\n",[1120,1940,1941],{"class":1122,"line":1129},[1120,1942,1225],{},[1120,1944,1945],{"class":1122,"line":1135},[1120,1946,1947],{},"    System.out.println(result);\n",[1120,1949,1950],{"class":1122,"line":1142},[1120,1951,1252],{},[1111,1953,1956],{"className":1954,"code":1955,"language":1602},[1600],"Match 1: 38.0 vs IronClad\nMatch 2: 45.5 vs Voltage Vipers\nMatch 3: 52.0 vs Circuit Breakers\n",[1095,1957,1955],{"__ignoreMap":1116},[1080,1959,1961],{"id":1960},"recap","Recap",[1456,1963,1964,1974,1980,1985,1988],{},[1459,1965,1966,1508,1968,1511,1970,1515,1972,1518],{},[1095,1967,1097],{},[1095,1969,1105],{},[1095,1971,1514],{},[1095,1973,1191],{},[1459,1975,1976,1523,1978,1527],{},[1095,1977,1294],{},[1095,1979,1526],{},[1459,1981,1982,1984],{},[1095,1983,1532],{}," breaks a CSV line into fields.",[1459,1986,1987],{},"The first line of a CSV is often column names, not values — skip it before parsing rows as real data.",[1459,1989,1541],{},[1554,1991,1556],{},{"title":1116,"searchDepth":1129,"depth":1129,"links":1993},[1994,1995,1996,1998,1999,2000,2002,2003,2004],{"id":1582,"depth":1129,"text":1583},{"id":1607,"depth":1129,"text":1608},{"id":1632,"depth":1129,"text":1997},"Step 2: Define MatchResult",{"id":1744,"depth":1129,"text":1745},{"id":1805,"depth":1129,"text":1806},{"id":1827,"depth":1129,"text":2001},"Step 5: Read Each Remaining Row Into a MatchResult",{"id":1908,"depth":1129,"text":1909},{"id":1927,"depth":1129,"text":1928},{"id":1960,"depth":1129,"text":1961},{"outlineRef":1569,"pairsWith":2006,"status":2007},"[`lessons\u002Fch09-storing-data\u002F9.8-using-text-files.md`](..\u002F..\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":607,"description":1116},"k7x1cD0UIx-5-TLupJYegp3LPwVRzmYKF77sxgjUQgE",{"id":2011,"title":916,"body":2012,"description":1116,"extension":1567,"meta":3144,"navigation":1138,"path":915,"seo":3146,"stem":917,"__hash__":3147},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files.md",{"type":1073,"value":2013,"toc":3139},[2014,2017,2021,2035,2065,2070,2092,2098,2122,2149,2153,2163,2166,2240,2245,2251,2374,2463,2467,2473,2507,2521,2542,2547,2704,2709,2714,2720,2725,2731,2736,2740,2746,2750,2756,2761,2765,2771,2775,2781,2786,2790,2796,2800,2806,2811,2815,2821,2825,2830,2835,2839,2845,2849,2855,2860,3071,3137],[1076,2015,916],{"id":2016},"using-text-files-exercises",[1080,2018,2020],{"id":2019},"multiple-choice","Multiple Choice",[1085,2022,2023,2026,2027,2030,2031,2034],{},[1462,2024,2025],{},"Question:"," A CSV file's first line is ",[1095,2028,2029],{},"teamNumber,winCount"," (column headers), followed by real data rows like ",[1095,2032,2033],{},"1622,14",". What happens if this code runs without skipping the header row first?",[1111,2036,2038],{"className":1113,"code":2037,"language":1115,"meta":1116,"style":1116},"while (scan.hasNextLine())\n{\n    String[] fields = scan.nextLine().split(\",\");\n    int wins = Integer.parseInt(fields[1]);\n    \u002F\u002F ...\n}\n",[1095,2039,2040,2044,2048,2052,2057,2061],{"__ignoreMap":1116},[1120,2041,2042],{"class":1122,"line":1123},[1120,2043,1266],{},[1120,2045,2046],{"class":1122,"line":1129},[1120,2047,1225],{},[1120,2049,2050],{"class":1122,"line":1135},[1120,2051,1441],{},[1120,2053,2054],{"class":1122,"line":1142},[1120,2055,2056],{},"    int wins = Integer.parseInt(fields[1]);\n",[1120,2058,2059],{"class":1122,"line":1148},[1120,2060,1240],{},[1120,2062,2063],{"class":1122,"line":1243},[1120,2064,1252],{},[1085,2066,2067],{},[1462,2068,2069],{},"Options:",[1456,2071,2072,2083,2086,2089],{},[1459,2073,2074,2075,2078,2079,2082],{},"A. Throws a ",[1095,2076,2077],{},"NumberFormatException"," when it tries to parse ",[1095,2080,2081],{},"\"winCount\""," as an integer",[1459,2084,2085],{},"B. Silently treats the header as a valid row with 0 wins",[1459,2087,2088],{},"C. Automatically skips the header row, since Java recognizes column names",[1459,2090,2091],{},"D. Compiles fine but the loop never runs",[1085,2093,2094,2097],{},[1462,2095,2096],{},"Answer:"," A",[1085,2099,2100,2103,2104,2107,2108,2110,2111,2114,2115,2118,2119,2121],{},[1462,2101,2102],{},"Why:"," On the very first iteration, ",[1095,2105,2106],{},"fields[1]"," is the literal text ",[1095,2109,2081],{},", and ",[1095,2112,2113],{},"Integer.parseInt(\"winCount\")"," can't convert non-numeric text into an ",[1095,2116,2117],{},"int"," — it throws a ",[1095,2120,2077],{}," at run time. This is exactly why the lesson calls out skipping the header row as a required step, not optional cleanup.",[1456,2123,2124,2134,2137],{},[1459,2125,2126,2127,2129,2130,2133],{},"B is wrong — Java doesn't guess a fallback value; trying to parse non-numeric text as an ",[1095,2128,2117],{}," fails loudly instead of quietly substituting ",[1095,2131,2132],{},"0",".",[1459,2135,2136],{},"C is wrong — Java has no built-in awareness of \"column headers\" in a CSV; it reads whatever text is on the first line just like any other line.",[1459,2138,2139,2140,1295,2142,2144,2145,2148],{},"D is wrong — the loop does run: ",[1095,2141,1294],{},[1095,2143,1298],{}," and the first ",[1095,2146,2147],{},"nextLine()"," succeeds; the crash happens partway through processing that first line, not before the loop starts.",[1080,2150,2152],{"id":2151},"micro-parsons","Micro-Parsons",[1085,2154,2155,2158,2159,2162],{},[1462,2156,2157],{},"Problem:"," This method will live in a class alongside a ",[1095,2160,2161],{},"main"," method that calls it with a filename. These lines, once correctly ordered, form the complete method that opens a file by name, counts how many lines it contains, and returns that count.",[1085,2164,2165],{},"Reorder the fragments below into a working method:",[1456,2167,2168,2174,2180,2186,2192,2198,2204,2210,2216,2222,2228,2234],{},[1459,2169,2170,2171],{},"a. ",[1095,2172,2173],{},"    public static int countLines(String filename) throws IOException",[1459,2175,2176,2177],{},"b. ",[1095,2178,2179],{},"    {",[1459,2181,2182,2183],{},"c. ",[1095,2184,2185],{},"        Scanner scan = new Scanner(new File(filename));",[1459,2187,2188,2189],{},"d. ",[1095,2190,2191],{},"        int count = 0;",[1459,2193,2194,2195],{},"e. ",[1095,2196,2197],{},"        while (scan.hasNextLine())",[1459,2199,2200,2201],{},"f. ",[1095,2202,2203],{},"        {",[1459,2205,2206,2207],{},"g. ",[1095,2208,2209],{},"            scan.nextLine();",[1459,2211,2212,2213],{},"h. ",[1095,2214,2215],{},"            count++;",[1459,2217,2218,2219],{},"i. ",[1095,2220,2221],{},"        }",[1459,2223,2224,2225],{},"j. ",[1095,2226,2227],{},"        scan.close();",[1459,2229,2230,2231],{},"k. ",[1095,2232,2233],{},"        return count;",[1459,2235,2236,2237],{},"l. ",[1095,2238,2239],{},"    }",[1085,2241,2242,2244],{},[1462,2243,2096],{}," a, b, c, d, e, f, g, h, i, j, k, l",[1085,2246,2247,2250],{},[1462,2248,2249],{},"Interchangeable:"," (c, d)",[1111,2252,2254],{"className":1113,"code":2253,"language":1115,"meta":1116,"style":1116},"import java.io.File;\nimport java.io.IOException;\nimport java.util.Scanner;\n\npublic class MatchLogReader\n{\n    public static int countLines(String filename) throws IOException\n    {\n        Scanner scan = new Scanner(new File(filename));\n        int count = 0;\n        while (scan.hasNextLine())\n        {\n            scan.nextLine();\n            count++;\n        }\n        scan.close();\n        return count;\n    }\n\n    public static void main(String[] args) throws IOException\n    {\n        System.out.println(countLines(\"matchLog.txt\"));\n    }\n}\n",[1095,2255,2256,2261,2266,2271,2275,2280,2284,2289,2293,2298,2303,2308,2313,2318,2323,2328,2333,2338,2342,2347,2353,2358,2364,2369],{"__ignoreMap":1116},[1120,2257,2258],{"class":1122,"line":1123},[1120,2259,2260],{},"import java.io.File;\n",[1120,2262,2263],{"class":1122,"line":1129},[1120,2264,2265],{},"import java.io.IOException;\n",[1120,2267,2268],{"class":1122,"line":1135},[1120,2269,2270],{},"import java.util.Scanner;\n",[1120,2272,2273],{"class":1122,"line":1142},[1120,2274,1139],{"emptyLinePlaceholder":1138},[1120,2276,2277],{"class":1122,"line":1148},[1120,2278,2279],{},"public class MatchLogReader\n",[1120,2281,2282],{"class":1122,"line":1243},[1120,2283,1225],{},[1120,2285,2286],{"class":1122,"line":1249},[1120,2287,2288],{},"    public static int countLines(String filename) throws IOException\n",[1120,2290,2291],{"class":1122,"line":1682},[1120,2292,1685],{},[1120,2294,2295],{"class":1122,"line":1688},[1120,2296,2297],{},"        Scanner scan = new Scanner(new File(filename));\n",[1120,2299,2300],{"class":1122,"line":1694},[1120,2301,2302],{},"        int count = 0;\n",[1120,2304,2305],{"class":1122,"line":1700},[1120,2306,2307],{},"        while (scan.hasNextLine())\n",[1120,2309,2310],{"class":1122,"line":1706},[1120,2311,2312],{},"        {\n",[1120,2314,2315],{"class":1122,"line":1712},[1120,2316,2317],{},"            scan.nextLine();\n",[1120,2319,2320],{"class":1122,"line":1717},[1120,2321,2322],{},"            count++;\n",[1120,2324,2325],{"class":1122,"line":1723},[1120,2326,2327],{},"        }\n",[1120,2329,2330],{"class":1122,"line":1728},[1120,2331,2332],{},"        scan.close();\n",[1120,2334,2335],{"class":1122,"line":1734},[1120,2336,2337],{},"        return count;\n",[1120,2339,2340],{"class":1122,"line":1739},[1120,2341,1709],{},[1120,2343,2345],{"class":1122,"line":2344},19,[1120,2346,1139],{"emptyLinePlaceholder":1138},[1120,2348,2350],{"class":1122,"line":2349},20,[1120,2351,2352],{},"    public static void main(String[] args) throws IOException\n",[1120,2354,2356],{"class":1122,"line":2355},21,[1120,2357,1685],{},[1120,2359,2361],{"class":1122,"line":2360},22,[1120,2362,2363],{},"        System.out.println(countLines(\"matchLog.txt\"));\n",[1120,2365,2367],{"class":1122,"line":2366},23,[1120,2368,1709],{},[1120,2370,2372],{"class":1122,"line":2371},24,[1120,2373,1252],{},[1085,2375,2376,2379,2380,2383,2384,2386,2387,2390,2391,2393,2394,2397,2398,2401,2402,2405,2406,2409,2410,2393,2412,2415,2416,2419,2420,2422,2423,2425,2426,1164,2429,2432,2433,2436,2437,2440,2441,2444,2445,2448,2449,2452,2453,2455,2456,2459,2460,2462],{},[1462,2377,2378],{},"Why this order:"," The method header (",[1095,2381,2382],{},"a",") needs ",[1095,2385,1191],{}," since opening a file can fail, and its opening brace (",[1095,2388,2389],{},"b",") follows immediately. The ",[1095,2392,1105],{}," (",[1095,2395,2396],{},"c",") and the ",[1095,2399,2400],{},"count"," variable (",[1095,2403,2404],{},"d",") neither one reads the other, so they can go in either order — declared ",[1095,2407,2408],{},"**Interchangeable:**",". ",[1095,2411,1294],{},[1095,2413,2414],{},"e","), not ",[1095,2417,2418],{},"hasNext()",", is what's being tested here: ",[1095,2421,2418],{}," looks for the next non-whitespace token and can silently miss a blank trailing line, undercounting; ",[1095,2424,1294],{}," counts every line, blank or not. Inside the loop (",[1095,2427,2428],{},"f",[1095,2430,2431],{},"i","), each pass reads one line (",[1095,2434,2435],{},"g",") and bumps the counter (",[1095,2438,2439],{},"h",") — two separate statements, kept as two separate fragments. Once the loop finishes, the scanner is closed (",[1095,2442,2443],{},"j",") and the final count is returned (",[1095,2446,2447],{},"k",") — closing and returning only make sense after every line has been read, and returning has to come after closing, not before. The method's closing brace (",[1095,2450,2451],{},"l",") comes last. The surrounding class, imports, and ",[1095,2454,2161],{}," (which calls ",[1095,2457,2458],{},"countLines"," and also declares ",[1095,2461,1191],{},") are the given scaffold.",[1080,2464,2466],{"id":2465},"coding","Coding",[1085,2468,2469,2472],{},[1462,2470,2471],{},"Mode:"," full-program",[1085,2474,2475,2477,2478,2481,2482,2485,2486,2488,2489,2491,2492,2495,2496,2499,2500,2503,2504,2133],{},[1462,2476,2157],{}," Autonomous routes are stored in a CSV file with a header row: ",[1095,2479,2480],{},"route,seconds,alliance",". Write the\nmethod ",[1095,2483,2484],{},"RouteLoader.fastestRoute(String filename, String alliance)",", which opens the file with ",[1095,2487,1097],{}," and\n",[1095,2490,1105],{},", reads it line by line, and returns the ",[1462,2493,2494],{},"name of the route with the smallest time among the\nroutes for that alliance",". If no route matches the alliance (or the file has only the header), return\n",[1095,2497,2498],{},"\"none\"",". If two matching routes have the same time, return the ",[1462,2501,2502],{},"first"," one in the file. Compare the\nalliance text with ",[1095,2505,2506],{},".equals",[1085,2508,2509,2510,2512,2513,2516,2517,2520],{},"Piston can't hand a program a file, so the fixed ",[1095,2511,2161],{}," first copies its input into a file called\n",[1095,2514,2515],{},"auto_config.csv"," (the first input line is the alliance to look for, the rest is the file's contents) and\nthen calls your method. You only write the reading part. The header row is ",[1462,2518,2519],{},"not"," a route: skip it.",[1085,2522,2523,2524,2527,2528,2531,2532,1157,2535,2538,2539,2133],{},"For example, for ",[1095,2525,2526],{},"BlueAlliance"," and the file lines ",[1095,2529,2530],{},"3-Piece-Left,14.2,BlueAlliance",",\n",[1095,2533,2534],{},"2-Piece-Center,9.5,BlueAlliance",[1095,2536,2537],{},"3-Piece-Right,12.0,RedAlliance"," (after the header), it prints\n",[1095,2540,2541],{},"2-Piece-Center",[1085,2543,2544],{},[1462,2545,2546],{},"Starter:",[1111,2548,2550],{"className":1113,"code":2549,"language":1115,"meta":1116,"style":1116},"import java.io.*;\nimport java.util.*;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args) throws IOException\n    {\n        \u002F\u002F Set-up: copy the input lines into a file, so the program has a file to read\n        Scanner in = new Scanner(System.in);\n        String alliance = in.nextLine();\n        PrintWriter out = new PrintWriter(\"auto_config.csv\");\n        while (in.hasNextLine())\n        {\n            out.println(in.nextLine());\n        }\n        out.close();\n\n        System.out.println(RouteLoader.fastestRoute(\"auto_config.csv\", alliance));\n    }\n}\n\nclass RouteLoader\n{\n    \u002F\u002F Reads the CSV file and returns the name of the fastest route for the given alliance.\n    public static String fastestRoute(String filename, String alliance) throws IOException\n    {\n        \u002F\u002F TODO: open the file with File and Scanner, skip the header line, read the rest\n        \u002F\u002F       line by line, and split each line on commas\n        return null; \u002F\u002F placeholder: replace with your answer\n    }\n}\n",[1095,2551,2552,2556,2560,2564,2569,2573,2578,2582,2586,2591,2596,2601,2606,2611,2615,2620,2624,2629,2633,2638,2642,2646,2650,2655,2659,2665,2671,2676,2682,2688,2694,2699],{"__ignoreMap":1116},[1120,2553,2554],{"class":1122,"line":1123},[1120,2555,1126],{},[1120,2557,2558],{"class":1122,"line":1129},[1120,2559,1132],{},[1120,2561,2562],{"class":1122,"line":1135},[1120,2563,1139],{"emptyLinePlaceholder":1138},[1120,2565,2566],{"class":1122,"line":1142},[1120,2567,2568],{},"public class Main\n",[1120,2570,2571],{"class":1122,"line":1148},[1120,2572,1225],{},[1120,2574,2575],{"class":1122,"line":1243},[1120,2576,2577],{},"    \u002F\u002F Don't change main\n",[1120,2579,2580],{"class":1122,"line":1249},[1120,2581,2352],{},[1120,2583,2584],{"class":1122,"line":1682},[1120,2585,1685],{},[1120,2587,2588],{"class":1122,"line":1688},[1120,2589,2590],{},"        \u002F\u002F Set-up: copy the input lines into a file, so the program has a file to read\n",[1120,2592,2593],{"class":1122,"line":1694},[1120,2594,2595],{},"        Scanner in = new Scanner(System.in);\n",[1120,2597,2598],{"class":1122,"line":1700},[1120,2599,2600],{},"        String alliance = in.nextLine();\n",[1120,2602,2603],{"class":1122,"line":1706},[1120,2604,2605],{},"        PrintWriter out = new PrintWriter(\"auto_config.csv\");\n",[1120,2607,2608],{"class":1122,"line":1712},[1120,2609,2610],{},"        while (in.hasNextLine())\n",[1120,2612,2613],{"class":1122,"line":1717},[1120,2614,2312],{},[1120,2616,2617],{"class":1122,"line":1723},[1120,2618,2619],{},"            out.println(in.nextLine());\n",[1120,2621,2622],{"class":1122,"line":1728},[1120,2623,2327],{},[1120,2625,2626],{"class":1122,"line":1734},[1120,2627,2628],{},"        out.close();\n",[1120,2630,2631],{"class":1122,"line":1739},[1120,2632,1139],{"emptyLinePlaceholder":1138},[1120,2634,2635],{"class":1122,"line":2344},[1120,2636,2637],{},"        System.out.println(RouteLoader.fastestRoute(\"auto_config.csv\", alliance));\n",[1120,2639,2640],{"class":1122,"line":2349},[1120,2641,1709],{},[1120,2643,2644],{"class":1122,"line":2355},[1120,2645,1252],{},[1120,2647,2648],{"class":1122,"line":2360},[1120,2649,1139],{"emptyLinePlaceholder":1138},[1120,2651,2652],{"class":1122,"line":2366},[1120,2653,2654],{},"class RouteLoader\n",[1120,2656,2657],{"class":1122,"line":2371},[1120,2658,1225],{},[1120,2660,2662],{"class":1122,"line":2661},25,[1120,2663,2664],{},"    \u002F\u002F Reads the CSV file and returns the name of the fastest route for the given alliance.\n",[1120,2666,2668],{"class":1122,"line":2667},26,[1120,2669,2670],{},"    public static String fastestRoute(String filename, String alliance) throws IOException\n",[1120,2672,2674],{"class":1122,"line":2673},27,[1120,2675,1685],{},[1120,2677,2679],{"class":1122,"line":2678},28,[1120,2680,2681],{},"        \u002F\u002F TODO: open the file with File and Scanner, skip the header line, read the rest\n",[1120,2683,2685],{"class":1122,"line":2684},29,[1120,2686,2687],{},"        \u002F\u002F       line by line, and split each line on commas\n",[1120,2689,2691],{"class":1122,"line":2690},30,[1120,2692,2693],{},"        return null; \u002F\u002F placeholder: replace with your answer\n",[1120,2695,2697],{"class":1122,"line":2696},31,[1120,2698,1709],{},[1120,2700,2702],{"class":1122,"line":2701},32,[1120,2703,1252],{},[1085,2705,2706],{},[1462,2707,2708],{},"Scenario 1 (visible):",[1085,2710,2711],{},[1462,2712,2713],{},"Input:",[1111,2715,2718],{"className":2716,"code":2717,"language":1602,"meta":1116},[1600],"BlueAlliance\nroute,seconds,alliance\n3-Piece-Left,14.2,BlueAlliance\n2-Piece-Center,9.5,BlueAlliance\n3-Piece-Right,12.0,RedAlliance\n",[1095,2719,2717],{"__ignoreMap":1116},[1085,2721,2722],{},[1462,2723,2724],{},"Expected output:",[1111,2726,2729],{"className":2727,"code":2728,"language":1602,"meta":1116},[1600],"2-Piece-Center\n",[1095,2730,2728],{"__ignoreMap":1116},[1085,2732,2733],{},[1462,2734,2735],{},"Scenario 2 (visible):",[1085,2737,2738],{},[1462,2739,2713],{},[1111,2741,2744],{"className":2742,"code":2743,"language":1602,"meta":1116},[1600],"RedAlliance\nroute,seconds,alliance\n3-Piece-Left,14.2,BlueAlliance\n2-Piece-Center,9.5,BlueAlliance\n",[1095,2745,2743],{"__ignoreMap":1116},[1085,2747,2748],{},[1462,2749,2724],{},[1111,2751,2754],{"className":2752,"code":2753,"language":1602,"meta":1116},[1600],"none\n",[1095,2755,2753],{"__ignoreMap":1116},[1085,2757,2758],{},[1462,2759,2760],{},"Scenario 3 (visible):",[1085,2762,2763],{},[1462,2764,2713],{},[1111,2766,2769],{"className":2767,"code":2768,"language":1602,"meta":1116},[1600],"BlueAlliance\nroute,seconds,alliance\nTaxi-Only,3.0,BlueAlliance\n",[1095,2770,2768],{"__ignoreMap":1116},[1085,2772,2773],{},[1462,2774,2724],{},[1111,2776,2779],{"className":2777,"code":2778,"language":1602,"meta":1116},[1600],"Taxi-Only\n",[1095,2780,2778],{"__ignoreMap":1116},[1085,2782,2783],{},[1462,2784,2785],{},"Scenario 4 (hidden):",[1085,2787,2788],{},[1462,2789,2713],{},[1111,2791,2794],{"className":2792,"code":2793,"language":1602,"meta":1116},[1600],"RedAlliance\nroute,seconds,alliance\nA,5.0,BlueAlliance\nB,8.5,RedAlliance\nC,7.5,RedAlliance\nD,4.0,BlueAlliance\nE,7.5,RedAlliance\n",[1095,2795,2793],{"__ignoreMap":1116},[1085,2797,2798],{},[1462,2799,2724],{},[1111,2801,2804],{"className":2802,"code":2803,"language":1602,"meta":1116},[1600],"C\n",[1095,2805,2803],{"__ignoreMap":1116},[1085,2807,2808],{},[1462,2809,2810],{},"Scenario 5 (hidden):",[1085,2812,2813],{},[1462,2814,2713],{},[1111,2816,2819],{"className":2817,"code":2818,"language":1602,"meta":1116},[1600],"BlueAlliance\nroute,seconds,alliance\n",[1095,2820,2818],{"__ignoreMap":1116},[1085,2822,2823],{},[1462,2824,2724],{},[1111,2826,2828],{"className":2827,"code":2753,"language":1602,"meta":1116},[1600],[1095,2829,2753],{"__ignoreMap":1116},[1085,2831,2832],{},[1462,2833,2834],{},"Scenario 6 (hidden):",[1085,2836,2837],{},[1462,2838,2713],{},[1111,2840,2843],{"className":2841,"code":2842,"language":1602,"meta":1116},[1600],"BlueAlliance\nroute,seconds,alliance\nShort,3.0,RedAlliance\nLong,15.5,BlueAlliance\n",[1095,2844,2842],{"__ignoreMap":1116},[1085,2846,2847],{},[1462,2848,2724],{},[1111,2850,2853],{"className":2851,"code":2852,"language":1602,"meta":1116},[1600],"Long\n",[1095,2854,2852],{"__ignoreMap":1116},[1085,2856,2857],{},[1462,2858,2859],{},"Solution:",[1111,2861,2863],{"className":1113,"code":2862,"language":1115,"meta":1116,"style":1116},"import java.io.*;\nimport java.util.*;\n\npublic class Main\n{\n    \u002F\u002F Don't change main\n    public static void main(String[] args) throws IOException\n    {\n        \u002F\u002F Set-up: copy the input lines into a file, so the program has a file to read\n        Scanner in = new Scanner(System.in);\n        String alliance = in.nextLine();\n        PrintWriter out = new PrintWriter(\"auto_config.csv\");\n        while (in.hasNextLine())\n        {\n            out.println(in.nextLine());\n        }\n        out.close();\n\n        System.out.println(RouteLoader.fastestRoute(\"auto_config.csv\", alliance));\n    }\n}\n\nclass RouteLoader\n{\n    public static String fastestRoute(String filename, String alliance) throws IOException\n    {\n        File configFile = new File(filename);\n        Scanner scan = new Scanner(configFile);\n        scan.nextLine();\n        String bestName = \"none\";\n        double bestTime = 0.0;\n        while (scan.hasNextLine())\n        {\n            String[] fields = scan.nextLine().split(\",\");\n            double time = Double.parseDouble(fields[1]);\n            if (fields[2].equals(alliance) && (bestName.equals(\"none\") || time \u003C bestTime))\n            {\n                bestName = fields[0];\n                bestTime = time;\n            }\n        }\n        scan.close();\n        return bestName;\n    }\n}\n",[1095,2864,2865,2869,2873,2877,2881,2885,2889,2893,2897,2901,2905,2909,2913,2917,2921,2925,2929,2933,2937,2941,2945,2949,2953,2957,2961,2965,2969,2974,2979,2984,2989,2994,2998,3003,3009,3015,3021,3027,3033,3039,3045,3050,3055,3061,3066],{"__ignoreMap":1116},[1120,2866,2867],{"class":1122,"line":1123},[1120,2868,1126],{},[1120,2870,2871],{"class":1122,"line":1129},[1120,2872,1132],{},[1120,2874,2875],{"class":1122,"line":1135},[1120,2876,1139],{"emptyLinePlaceholder":1138},[1120,2878,2879],{"class":1122,"line":1142},[1120,2880,2568],{},[1120,2882,2883],{"class":1122,"line":1148},[1120,2884,1225],{},[1120,2886,2887],{"class":1122,"line":1243},[1120,2888,2577],{},[1120,2890,2891],{"class":1122,"line":1249},[1120,2892,2352],{},[1120,2894,2895],{"class":1122,"line":1682},[1120,2896,1685],{},[1120,2898,2899],{"class":1122,"line":1688},[1120,2900,2590],{},[1120,2902,2903],{"class":1122,"line":1694},[1120,2904,2595],{},[1120,2906,2907],{"class":1122,"line":1700},[1120,2908,2600],{},[1120,2910,2911],{"class":1122,"line":1706},[1120,2912,2605],{},[1120,2914,2915],{"class":1122,"line":1712},[1120,2916,2610],{},[1120,2918,2919],{"class":1122,"line":1717},[1120,2920,2312],{},[1120,2922,2923],{"class":1122,"line":1723},[1120,2924,2619],{},[1120,2926,2927],{"class":1122,"line":1728},[1120,2928,2327],{},[1120,2930,2931],{"class":1122,"line":1734},[1120,2932,2628],{},[1120,2934,2935],{"class":1122,"line":1739},[1120,2936,1139],{"emptyLinePlaceholder":1138},[1120,2938,2939],{"class":1122,"line":2344},[1120,2940,2637],{},[1120,2942,2943],{"class":1122,"line":2349},[1120,2944,1709],{},[1120,2946,2947],{"class":1122,"line":2355},[1120,2948,1252],{},[1120,2950,2951],{"class":1122,"line":2360},[1120,2952,1139],{"emptyLinePlaceholder":1138},[1120,2954,2955],{"class":1122,"line":2366},[1120,2956,2654],{},[1120,2958,2959],{"class":1122,"line":2371},[1120,2960,1225],{},[1120,2962,2963],{"class":1122,"line":2661},[1120,2964,2670],{},[1120,2966,2967],{"class":1122,"line":2667},[1120,2968,1685],{},[1120,2970,2971],{"class":1122,"line":2673},[1120,2972,2973],{},"        File configFile = new File(filename);\n",[1120,2975,2976],{"class":1122,"line":2678},[1120,2977,2978],{},"        Scanner scan = new Scanner(configFile);\n",[1120,2980,2981],{"class":1122,"line":2684},[1120,2982,2983],{},"        scan.nextLine();\n",[1120,2985,2986],{"class":1122,"line":2690},[1120,2987,2988],{},"        String bestName = \"none\";\n",[1120,2990,2991],{"class":1122,"line":2696},[1120,2992,2993],{},"        double bestTime = 0.0;\n",[1120,2995,2996],{"class":1122,"line":2701},[1120,2997,2307],{},[1120,2999,3001],{"class":1122,"line":3000},33,[1120,3002,2312],{},[1120,3004,3006],{"class":1122,"line":3005},34,[1120,3007,3008],{},"            String[] fields = scan.nextLine().split(\",\");\n",[1120,3010,3012],{"class":1122,"line":3011},35,[1120,3013,3014],{},"            double time = Double.parseDouble(fields[1]);\n",[1120,3016,3018],{"class":1122,"line":3017},36,[1120,3019,3020],{},"            if (fields[2].equals(alliance) && (bestName.equals(\"none\") || time \u003C bestTime))\n",[1120,3022,3024],{"class":1122,"line":3023},37,[1120,3025,3026],{},"            {\n",[1120,3028,3030],{"class":1122,"line":3029},38,[1120,3031,3032],{},"                bestName = fields[0];\n",[1120,3034,3036],{"class":1122,"line":3035},39,[1120,3037,3038],{},"                bestTime = time;\n",[1120,3040,3042],{"class":1122,"line":3041},40,[1120,3043,3044],{},"            }\n",[1120,3046,3048],{"class":1122,"line":3047},41,[1120,3049,2327],{},[1120,3051,3053],{"class":1122,"line":3052},42,[1120,3054,2332],{},[1120,3056,3058],{"class":1122,"line":3057},43,[1120,3059,3060],{},"        return bestName;\n",[1120,3062,3064],{"class":1122,"line":3063},44,[1120,3065,1709],{},[1120,3067,3069],{"class":1122,"line":3068},45,[1120,3070,1252],{},[1085,3072,3073,3075,3076,3079,3080,3083,3084,3086,3087,3089,3090,3093,3094,3096,3097,3100,3101,3103,3104,3107,3108,3110,3111,3114,3115,3118,3119,3122,3123,3126,3127,3130,3131,3133,3134,2133],{},[1462,3074,2102],{}," Opening the file is the lesson's two-step: ",[1095,3077,3078],{},"new File(filename)"," only holds a name, and\n",[1095,3081,3082],{},"new Scanner(configFile)"," is what can fail, which is why the method header already says\n",[1095,3085,1191],{},". One ",[1095,3088,1487],{}," before the loop throws away the header; skipping that step\nmakes ",[1095,3091,3092],{},"Double.parseDouble(\"seconds\")"," crash with a ",[1095,3095,2077],{}," on the first line. Inside the\n",[1095,3098,3099],{},"while (scan.hasNextLine())"," loop, ",[1095,3102,1313],{}," gives ",[1095,3105,3106],{},"fields[0]"," (name), ",[1095,3109,2106],{}," (time) and\n",[1095,3112,3113],{},"fields[2]"," (alliance). Seeding the best route from the first ",[1182,3116,3117],{},"matching"," route, rather than from a time\nlike ",[1095,3120,3121],{},"0.0",", is what keeps the answer right, and ",[1095,3124,3125],{},"\u003C"," rather than ",[1095,3128,3129],{},"\u003C="," keeps the first of two equal times.\nThe alliance has to be compared with ",[1095,3132,2506],{},", not ",[1095,3135,3136],{},"==",[1554,3138,1556],{},{"title":1116,"searchDepth":1129,"depth":1129,"links":3140},[3141,3142,3143],{"id":2019,"depth":1129,"text":2020},{"id":2151,"depth":1129,"text":2152},{"id":2465,"depth":1129,"text":2466},{"outlineRef":1569,"pairsWith":2006,"status":3145},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":916,"description":1116},"FCESGHiB0jGF2ooXmjjr6rhdBAEl7i7yRmZFA6rjQO4",1792718165956]