[{"data":1,"prerenderedAt":3111},["ShallowReactive",2],{"item-lessons-light-ch28-algorithms-searching-sorting-recursion":3,"item-examples-light-ch28-algorithms-searching-sorting-recursion":444,"item-exercises-light-ch28-algorithms-searching-sorting-recursion":753,"item-lesson-full-ch28-algorithms-searching-sorting-recursion-28.1":1070,"item-example-full-ch28-algorithms-searching-sorting-recursion-28.1":1694,"item-exercise-full-ch28-algorithms-searching-sorting-recursion-28.1":2274},[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":310,"body":1072,"description":1687,"extension":1688,"meta":1689,"navigation":1215,"path":309,"seo":1692,"stem":311,"__hash__":1693},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms.md",{"type":1073,"value":1074,"toc":1679},"minimark",[1075,1079,1087,1092,1098,1176,1191,1194,1198,1201,1286,1312,1316,1334,1445,1475,1479,1498,1561,1568,1585,1589,1625,1629,1664,1675],[1076,1077,310],"h1",{"id":1078},"searching-algorithms",[1080,1081,1082,1086],"p",{},[1083,1084,1085],"strong",{},"⚠ Optional chapter."," This chapter deepens the array\u002F2D-array work from Ch.9\u002FCh.10 with two classic algorithms — informational, not required for FRC programming itself.",[1088,1089,1091],"h2",{"id":1090},"linear-sequential-search","Linear (Sequential) Search",[1080,1093,1094,1097],{},[1083,1095,1096],{},"Linear search"," checks each element in order until it finds the target or runs out of elements — the same \"check every element\" shape from Ch.9.5, applied specifically to finding a value:",[1099,1100,1105],"pre",{"className":1101,"code":1102,"language":1103,"meta":1104,"style":1104},"language-java shiki shiki-themes github-light github-dark","public static int sequentialSearch(int[] canBusIds, int target)\n{\n    for (int j = 0; j \u003C canBusIds.length; j++)\n    {\n        if (canBusIds[j] == target)\n        {\n            return j;\n        }\n    }\n    return -1; \u002F\u002F not found\n}\n","java","",[1106,1107,1108,1116,1122,1128,1134,1140,1146,1152,1158,1164,1170],"code",{"__ignoreMap":1104},[1109,1110,1113],"span",{"class":1111,"line":1112},"line",1,[1109,1114,1115],{},"public static int sequentialSearch(int[] canBusIds, int target)\n",[1109,1117,1119],{"class":1111,"line":1118},2,[1109,1120,1121],{},"{\n",[1109,1123,1125],{"class":1111,"line":1124},3,[1109,1126,1127],{},"    for (int j = 0; j \u003C canBusIds.length; j++)\n",[1109,1129,1131],{"class":1111,"line":1130},4,[1109,1132,1133],{},"    {\n",[1109,1135,1137],{"class":1111,"line":1136},5,[1109,1138,1139],{},"        if (canBusIds[j] == target)\n",[1109,1141,1143],{"class":1111,"line":1142},6,[1109,1144,1145],{},"        {\n",[1109,1147,1149],{"class":1111,"line":1148},7,[1109,1150,1151],{},"            return j;\n",[1109,1153,1155],{"class":1111,"line":1154},8,[1109,1156,1157],{},"        }\n",[1109,1159,1161],{"class":1111,"line":1160},9,[1109,1162,1163],{},"    }\n",[1109,1165,1167],{"class":1111,"line":1166},10,[1109,1168,1169],{},"    return -1; \u002F\u002F not found\n",[1109,1171,1173],{"class":1111,"line":1172},11,[1109,1174,1175],{},"}\n",[1080,1177,1178,1179,1182,1183,1186,1187,1190],{},"Searching for a ",[1106,1180,1181],{},"String"," (like an autonomous route name) needs ",[1106,1184,1185],{},".equals()"," instead of ",[1106,1188,1189],{},"=="," (Lesson 6.1\u002F13) — comparing object content, not identity.",[1080,1192,1193],{},"Linear search's slowest case is a target that isn't present at all — the loop has to check every single element before concluding that. Its fastest case is the target sitting at index 0.",[1088,1195,1197],{"id":1196},"linear-search-over-a-2d-array","Linear Search Over a 2D Array",[1080,1199,1200],{},"Extending linear search to a 2D array (Ch.10) just means looping through every row and searching within it — the same nested-loop shape from Ch.10.3:",[1099,1202,1204],{"className":1101,"code":1203,"language":1103,"meta":1104,"style":1104},"private static final double TOLERANCE = 1e-9;\n\npublic static boolean containsFault(double[][] moduleCurrents, double faultValue)\n{\n    for (int row = 0; row \u003C moduleCurrents.length; row++)\n    {\n        for (int col = 0; col \u003C moduleCurrents[row].length; col++)\n        {\n            if (Math.abs(moduleCurrents[row][col] - faultValue) \u003C TOLERANCE)\n            {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n",[1106,1205,1206,1211,1217,1222,1226,1231,1235,1240,1244,1249,1254,1259,1265,1270,1275,1281],{"__ignoreMap":1104},[1109,1207,1208],{"class":1111,"line":1112},[1109,1209,1210],{},"private static final double TOLERANCE = 1e-9;\n",[1109,1212,1213],{"class":1111,"line":1118},[1109,1214,1216],{"emptyLinePlaceholder":1215},true,"\n",[1109,1218,1219],{"class":1111,"line":1124},[1109,1220,1221],{},"public static boolean containsFault(double[][] moduleCurrents, double faultValue)\n",[1109,1223,1224],{"class":1111,"line":1130},[1109,1225,1121],{},[1109,1227,1228],{"class":1111,"line":1136},[1109,1229,1230],{},"    for (int row = 0; row \u003C moduleCurrents.length; row++)\n",[1109,1232,1233],{"class":1111,"line":1142},[1109,1234,1133],{},[1109,1236,1237],{"class":1111,"line":1148},[1109,1238,1239],{},"        for (int col = 0; col \u003C moduleCurrents[row].length; col++)\n",[1109,1241,1242],{"class":1111,"line":1154},[1109,1243,1145],{},[1109,1245,1246],{"class":1111,"line":1160},[1109,1247,1248],{},"            if (Math.abs(moduleCurrents[row][col] - faultValue) \u003C TOLERANCE)\n",[1109,1250,1251],{"class":1111,"line":1166},[1109,1252,1253],{},"            {\n",[1109,1255,1256],{"class":1111,"line":1172},[1109,1257,1258],{},"                return true;\n",[1109,1260,1262],{"class":1111,"line":1261},12,[1109,1263,1264],{},"            }\n",[1109,1266,1268],{"class":1111,"line":1267},13,[1109,1269,1157],{},[1109,1271,1273],{"class":1111,"line":1272},14,[1109,1274,1163],{},[1109,1276,1278],{"class":1111,"line":1277},15,[1109,1279,1280],{},"    return false;\n",[1109,1282,1284],{"class":1111,"line":1283},16,[1109,1285,1175],{},[1080,1287,1288,1289,1292,1293,1296,1297,1300,1301,1304,1305,1307,1308,1311],{},"Two details worth calling out: the inner loop bound is ",[1106,1290,1291],{},"moduleCurrents[row].length",", not ",[1106,1294,1295],{},"moduleCurrents[0].length"," — a jagged 2D array (Ch.10) doesn't guarantee every row is the same length, so sizing the inner loop off row 0 alone can skip elements in a longer row, or throw ",[1106,1298,1299],{},"ArrayIndexOutOfBoundsException"," on a shorter one. And the comparison uses a small ",[1106,1302,1303],{},"TOLERANCE"," constant instead of ",[1106,1306,1189],{}," — comparing ",[1106,1309,1310],{},"double","s for exact equality is exactly the trap Lesson 2.4 warns about, and it applies here too.",[1088,1313,1315],{"id":1314},"binary-search-only-works-on-sorted-data","Binary Search: Only Works on Sorted Data",[1080,1317,1318,1321,1322,1325,1326,1329,1330,1333],{},[1083,1319,1320],{},"Binary search"," is dramatically faster than linear search, but only works on data that's already ",[1083,1323,1324],{},"sorted"," — like looking up a name in a phone book by jumping to roughly the right spot, instead of checking every page from the start. It keeps ",[1106,1327,1328],{},"left","\u002F",[1106,1331,1332],{},"right"," bounds, checks the middle element, and eliminates half the remaining range every time:",[1099,1335,1337],{"className":1101,"code":1336,"language":1103,"meta":1104,"style":1104},"public static int binarySearch(int[] sortedTemps, int target)\n{\n    int left = 0;\n    int right = sortedTemps.length - 1;\n    while (left \u003C= right)\n    {\n        int middle = (left + right) \u002F 2;\n        if (target \u003C sortedTemps[middle])\n        {\n            right = middle - 1; \u002F\u002F target must be in the left half\n        }\n        else if (target > sortedTemps[middle])\n        {\n            left = middle + 1;  \u002F\u002F target must be in the right half\n        }\n        else\n        {\n            return middle;      \u002F\u002F found it\n        }\n    }\n    return -1; \u002F\u002F left > right means the range is exhausted — not found\n}\n",[1106,1338,1339,1344,1348,1353,1358,1363,1367,1372,1377,1381,1386,1390,1395,1399,1404,1408,1413,1418,1424,1429,1434,1440],{"__ignoreMap":1104},[1109,1340,1341],{"class":1111,"line":1112},[1109,1342,1343],{},"public static int binarySearch(int[] sortedTemps, int target)\n",[1109,1345,1346],{"class":1111,"line":1118},[1109,1347,1121],{},[1109,1349,1350],{"class":1111,"line":1124},[1109,1351,1352],{},"    int left = 0;\n",[1109,1354,1355],{"class":1111,"line":1130},[1109,1356,1357],{},"    int right = sortedTemps.length - 1;\n",[1109,1359,1360],{"class":1111,"line":1136},[1109,1361,1362],{},"    while (left \u003C= right)\n",[1109,1364,1365],{"class":1111,"line":1142},[1109,1366,1133],{},[1109,1368,1369],{"class":1111,"line":1148},[1109,1370,1371],{},"        int middle = (left + right) \u002F 2;\n",[1109,1373,1374],{"class":1111,"line":1154},[1109,1375,1376],{},"        if (target \u003C sortedTemps[middle])\n",[1109,1378,1379],{"class":1111,"line":1160},[1109,1380,1145],{},[1109,1382,1383],{"class":1111,"line":1166},[1109,1384,1385],{},"            right = middle - 1; \u002F\u002F target must be in the left half\n",[1109,1387,1388],{"class":1111,"line":1172},[1109,1389,1157],{},[1109,1391,1392],{"class":1111,"line":1261},[1109,1393,1394],{},"        else if (target > sortedTemps[middle])\n",[1109,1396,1397],{"class":1111,"line":1267},[1109,1398,1145],{},[1109,1400,1401],{"class":1111,"line":1272},[1109,1402,1403],{},"            left = middle + 1;  \u002F\u002F target must be in the right half\n",[1109,1405,1406],{"class":1111,"line":1277},[1109,1407,1157],{},[1109,1409,1410],{"class":1111,"line":1283},[1109,1411,1412],{},"        else\n",[1109,1414,1416],{"class":1111,"line":1415},17,[1109,1417,1145],{},[1109,1419,1421],{"class":1111,"line":1420},18,[1109,1422,1423],{},"            return middle;      \u002F\u002F found it\n",[1109,1425,1427],{"class":1111,"line":1426},19,[1109,1428,1157],{},[1109,1430,1432],{"class":1111,"line":1431},20,[1109,1433,1163],{},[1109,1435,1437],{"class":1111,"line":1436},21,[1109,1438,1439],{},"    return -1; \u002F\u002F left > right means the range is exhausted — not found\n",[1109,1441,1443],{"class":1111,"line":1442},22,[1109,1444,1175],{},[1080,1446,1447,1448,1451,1452,1455,1456,1329,1459,1462,1463,1466,1467,1470,1471,1474],{},"For a ",[1106,1449,1450],{},"String[]",", ",[1106,1453,1454],{},"compareTo"," (Ch.6.1) replaces ",[1106,1457,1458],{},"\u003C",[1106,1460,1461],{},">"," (which only work on primitives): ",[1106,1464,1465],{},"str.compareTo(other)"," returns negative, zero, or positive depending on whether ",[1106,1468,1469],{},"str"," sorts before, equal to, or after ",[1106,1472,1473],{},"other",".",[1088,1476,1478],{"id":1477},"why-binary-search-is-so-much-faster","Why Binary Search Is So Much Faster",[1080,1480,1481,1482,1485,1486,1488,1489,1492,1493,1497],{},"Linear search's worst case takes ",[1106,1483,1484],{},"n"," comparisons for ",[1106,1487,1484],{}," elements. Binary search's worst case only takes roughly ",[1106,1490,1491],{},"log₂(n)"," — each comparison eliminates ",[1494,1495,1496],"em",{},"half"," the remaining data, not just one element:",[1499,1500,1501,1517],"table",{},[1502,1503,1504],"thead",{},[1505,1506,1507,1511,1514],"tr",{},[1508,1509,1510],"th",{},"Elements (n)",[1508,1512,1513],{},"Linear Search",[1508,1515,1516],{},"Binary Search",[1518,1519,1520,1531,1541,1551],"tbody",{},[1505,1521,1522,1526,1528],{},[1523,1524,1525],"td",{},"8",[1523,1527,1525],{},[1523,1529,1530],{},"4",[1505,1532,1533,1536,1538],{},[1523,1534,1535],{},"16",[1523,1537,1535],{},[1523,1539,1540],{},"5",[1505,1542,1543,1546,1548],{},[1523,1544,1545],{},"100",[1523,1547,1545],{},[1523,1549,1550],{},"7",[1505,1552,1553,1556,1558],{},[1523,1554,1555],{},"500",[1523,1557,1555],{},[1523,1559,1560],{},"~9",[1080,1562,1563,1564,1567],{},"Doubling the data size costs linear search twice the work, but only costs binary search ",[1494,1565,1566],{},"one more comparison",". This growth-rate distinction — O(n) vs. O(log n) in formal terms — is why sorted, frequently-searched data (a large lookup table, a big sorted config file) is worth keeping sorted specifically so binary search stays available.",[1080,1569,1570],{},[1494,1571,1572,1573,1576,1577,1580,1581,1584],{},"(Aside: ",[1106,1574,1575],{},"(left + right) \u002F 2"," can theoretically overflow ",[1106,1578,1579],{},"int"," on an enormous array; the overflow-safe form is ",[1106,1582,1583],{},"left + (right - left) \u002F 2",". Not a concern at these array sizes, but worth knowing it exists.)",[1088,1586,1588],{"id":1587},"common-pitfalls","Common Pitfalls",[1590,1591,1592,1599,1611],"ul",{},[1593,1594,1595,1598],"li",{},[1083,1596,1597],{},"Running binary search on unsorted data."," It will return wrong or missing results — binary search's entire correctness depends on the data already being sorted.",[1593,1600,1601,1604,1605,1607,1608,1610],{},[1083,1602,1603],{},"Assuming binary search requires integers."," It works on anything with a well-defined ordering — ",[1106,1606,1181],{},"s via ",[1106,1609,1454],{},", for instance.",[1593,1612,1613,1616,1617,1620,1621,1624],{},[1083,1614,1615],{},"Forgetting the loop-ending condition."," Binary search's ",[1106,1618,1619],{},"while (left \u003C= right)"," stops the moment the range is exhausted (",[1106,1622,1623],{},"left > right",") — a search for something not present must still terminate, not loop forever.",[1088,1626,1628],{"id":1627},"key-takeaways","Key Takeaways",[1590,1630,1631,1637,1643,1661],{},[1593,1632,1633,1634,1636],{},"Linear search checks every element in order; its worst case (not found) requires checking all ",[1106,1635,1484],{}," elements.",[1593,1638,1639,1640,1642],{},"Binary search only works on sorted data, but eliminates half the remaining range with each comparison — roughly ",[1106,1641,1491],{}," comparisons worst case, vastly faster for large data sets.",[1593,1644,1645,1646,1329,1648,1651,1652,1654,1655,1329,1657,1329,1659,1474],{},"Use ",[1106,1647,1185],{},[1106,1649,1650],{},"compareTo()"," for ",[1106,1653,1181],{}," comparisons in either algorithm, never ",[1106,1656,1189],{},[1106,1658,1458],{},[1106,1660,1461],{},[1593,1662,1663],{},"The gap between linear and binary search's growth rates is exactly why sorted data (Lesson 28.2 covers how to get it that way) is worth maintaining when it's searched often.",[1080,1665,1666,1667,1670,1671,1674],{},"Derived from ",[1106,1668,1669],{},"csawesome-2026",": ",[1106,1672,1673],{},"unit-4-data-collections\u002F4.14-searching-algorithms.md"," (CSA 4.14)",[1676,1677,1678],"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":1104,"searchDepth":1118,"depth":1118,"links":1680},[1681,1682,1683,1684,1685,1686],{"id":1090,"depth":1118,"text":1091},{"id":1196,"depth":1118,"text":1197},{"id":1314,"depth":1118,"text":1315},{"id":1477,"depth":1118,"text":1478},{"id":1587,"depth":1118,"text":1588},{"id":1627,"depth":1118,"text":1628},"⚠ Optional chapter. This chapter deepens the array\u002F2D-array work from Ch.9\u002FCh.10 with two classic algorithms — informational, not required for FRC programming itself.","md",{"outlineRef":1690,"status":1691},"28.1 — Searching Algorithms (CSA 4.14)","new — authored lesson",{"title":310,"description":1687},"RGLFDfXDb-fkRDMEKRlsdpNbnmNTcPjEV8yGcDDS4iY",{"id":1695,"title":739,"body":1696,"description":1104,"extension":1688,"meta":2269,"navigation":1215,"path":738,"seo":2272,"stem":740,"__hash__":2273},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms.md",{"type":1073,"value":1697,"toc":2260},[1698,1701,1705,1708,1712,1727,1736,1739,1743,1746,1798,1813,1820,1824,1832,1930,1937,2030,2050,2054,2059,2139,2161,2176,2180,2216,2223,2227,2258],[1076,1699,739],{"id":1700},"searching-algorithms-worked-example",[1088,1702,1704],{"id":1703},"problem","Problem",[1080,1706,1707],{},"The scouting app keeps the team numbers at this weekend's event in an array, already sorted from lowest to highest. A scout wants to jump to team 6328's entry, and also wants to check whether team 5000 is at the event at all. Look up both teams with a linear search and then with a binary search, and compare how many elements each one checks.",[1088,1709,1711],{"id":1710},"step-1-plan-it-first","Step 1: Plan It First",[1713,1714,1715,1718,1721,1724],"ol",{},[1593,1716,1717],{},"Store the sorted team numbers.",[1593,1719,1720],{},"Linear search: check each element in order, counting how many get checked.",[1593,1722,1723],{},"Binary search: check the middle, throw away the half that can't hold the target, repeat.",[1593,1725,1726],{},"Run both searches on a team that's present (6328) and one that isn't (5000), and compare.",[1099,1728,1730],{"className":1101,"code":1729,"language":1103,"meta":1104,"style":1104},"int[] eventTeams = {254, 604, 1114, 1622, 2056, 3310, 4414, 6328, 8033};\n",[1106,1731,1732],{"__ignoreMap":1104},[1109,1733,1734],{"class":1111,"line":1112},[1109,1735,1729],{},[1080,1737,1738],{},"There are 9 teams, at indexes 0 through 8. The array is sorted, which is the one thing binary search needs.",[1088,1740,1742],{"id":1741},"step-2-linear-search","Step 2: Linear Search",[1080,1744,1745],{},"Linear search doesn't care whether the data is sorted. It starts at index 0 and checks each element until it finds the target or runs out of elements:",[1099,1747,1749],{"className":1101,"code":1748,"language":1103,"meta":1104,"style":1104},"public static int findTeamLinear(int[] teams, int target)\n{\n    for (int j = 0; j \u003C teams.length; j++)\n    {\n        if (teams[j] == target)\n        {\n            return j;\n        }\n    }\n    return -1; \u002F\u002F not found\n}\n",[1106,1750,1751,1756,1760,1765,1769,1774,1778,1782,1786,1790,1794],{"__ignoreMap":1104},[1109,1752,1753],{"class":1111,"line":1112},[1109,1754,1755],{},"public static int findTeamLinear(int[] teams, int target)\n",[1109,1757,1758],{"class":1111,"line":1118},[1109,1759,1121],{},[1109,1761,1762],{"class":1111,"line":1124},[1109,1763,1764],{},"    for (int j = 0; j \u003C teams.length; j++)\n",[1109,1766,1767],{"class":1111,"line":1130},[1109,1768,1133],{},[1109,1770,1771],{"class":1111,"line":1136},[1109,1772,1773],{},"        if (teams[j] == target)\n",[1109,1775,1776],{"class":1111,"line":1142},[1109,1777,1145],{},[1109,1779,1780],{"class":1111,"line":1148},[1109,1781,1151],{},[1109,1783,1784],{"class":1111,"line":1154},[1109,1785,1157],{},[1109,1787,1788],{"class":1111,"line":1160},[1109,1789,1163],{},[1109,1791,1792],{"class":1111,"line":1166},[1109,1793,1169],{},[1109,1795,1796],{"class":1111,"line":1172},[1109,1797,1175],{},[1099,1799,1801],{"className":1101,"code":1800,"language":1103,"meta":1104,"style":1104},"System.out.println(findTeamLinear(eventTeams, 6328)); \u002F\u002F 7\nSystem.out.println(findTeamLinear(eventTeams, 5000)); \u002F\u002F -1\n",[1106,1802,1803,1808],{"__ignoreMap":1104},[1109,1804,1805],{"class":1111,"line":1112},[1109,1806,1807],{},"System.out.println(findTeamLinear(eventTeams, 6328)); \u002F\u002F 7\n",[1109,1809,1810],{"class":1111,"line":1118},[1109,1811,1812],{},"System.out.println(findTeamLinear(eventTeams, 5000)); \u002F\u002F -1\n",[1080,1814,1815,1816,1819],{},"Team 6328 is at index 7, so finding it takes 8 checks (indexes 0 through 7). Team 5000 isn't in the array, so the loop has to check all 9 elements before it can return ",[1106,1817,1818],{},"-1",". That's linear search's worst case.",[1088,1821,1823],{"id":1822},"step-3-binary-search-for-a-team-thats-present","Step 3: Binary Search for a Team That's Present",[1080,1825,1826,1827,1329,1829,1831],{},"Binary search keeps ",[1106,1828,1328],{},[1106,1830,1332],{}," bounds and checks the middle element each time:",[1099,1833,1835],{"className":1101,"code":1834,"language":1103,"meta":1104,"style":1104},"public static int findTeamBinary(int[] sortedTeams, int target)\n{\n    int left = 0;\n    int right = sortedTeams.length - 1;\n    while (left \u003C= right)\n    {\n        int middle = (left + right) \u002F 2;\n        if (target \u003C sortedTeams[middle])\n        {\n            right = middle - 1; \u002F\u002F target must be in the left half\n        }\n        else if (target > sortedTeams[middle])\n        {\n            left = middle + 1;  \u002F\u002F target must be in the right half\n        }\n        else\n        {\n            return middle;      \u002F\u002F found it\n        }\n    }\n    return -1; \u002F\u002F range exhausted — not found\n}\n",[1106,1836,1837,1842,1846,1850,1855,1859,1863,1867,1872,1876,1880,1884,1889,1893,1897,1901,1905,1909,1913,1917,1921,1926],{"__ignoreMap":1104},[1109,1838,1839],{"class":1111,"line":1112},[1109,1840,1841],{},"public static int findTeamBinary(int[] sortedTeams, int target)\n",[1109,1843,1844],{"class":1111,"line":1118},[1109,1845,1121],{},[1109,1847,1848],{"class":1111,"line":1124},[1109,1849,1352],{},[1109,1851,1852],{"class":1111,"line":1130},[1109,1853,1854],{},"    int right = sortedTeams.length - 1;\n",[1109,1856,1857],{"class":1111,"line":1136},[1109,1858,1362],{},[1109,1860,1861],{"class":1111,"line":1142},[1109,1862,1133],{},[1109,1864,1865],{"class":1111,"line":1148},[1109,1866,1371],{},[1109,1868,1869],{"class":1111,"line":1154},[1109,1870,1871],{},"        if (target \u003C sortedTeams[middle])\n",[1109,1873,1874],{"class":1111,"line":1160},[1109,1875,1145],{},[1109,1877,1878],{"class":1111,"line":1166},[1109,1879,1385],{},[1109,1881,1882],{"class":1111,"line":1172},[1109,1883,1157],{},[1109,1885,1886],{"class":1111,"line":1261},[1109,1887,1888],{},"        else if (target > sortedTeams[middle])\n",[1109,1890,1891],{"class":1111,"line":1267},[1109,1892,1145],{},[1109,1894,1895],{"class":1111,"line":1272},[1109,1896,1403],{},[1109,1898,1899],{"class":1111,"line":1277},[1109,1900,1157],{},[1109,1902,1903],{"class":1111,"line":1283},[1109,1904,1412],{},[1109,1906,1907],{"class":1111,"line":1415},[1109,1908,1145],{},[1109,1910,1911],{"class":1111,"line":1420},[1109,1912,1423],{},[1109,1914,1915],{"class":1111,"line":1426},[1109,1916,1157],{},[1109,1918,1919],{"class":1111,"line":1431},[1109,1920,1163],{},[1109,1922,1923],{"class":1111,"line":1436},[1109,1924,1925],{},"    return -1; \u002F\u002F range exhausted — not found\n",[1109,1927,1928],{"class":1111,"line":1442},[1109,1929,1175],{},[1080,1931,1932,1933,1936],{},"Tracing ",[1106,1934,1935],{},"findTeamBinary(eventTeams, 6328)",":",[1499,1938,1939,1967],{},[1502,1940,1941],{},[1505,1942,1943,1946,1950,1954,1959,1964],{},[1508,1944,1945],{},"Check",[1508,1947,1948],{},[1106,1949,1328],{},[1508,1951,1952],{},[1106,1953,1332],{},[1508,1955,1956],{},[1106,1957,1958],{},"middle",[1508,1960,1961],{},[1106,1962,1963],{},"sortedTeams[middle]",[1508,1965,1966],{},"Result",[1518,1968,1969,1990,2011],{},[1505,1970,1971,1974,1977,1979,1981,1984],{},[1523,1972,1973],{},"1",[1523,1975,1976],{},"0",[1523,1978,1525],{},[1523,1980,1530],{},[1523,1982,1983],{},"2056",[1523,1985,1986,1987],{},"6328 > 2056, so ",[1106,1988,1989],{},"left = 5",[1505,1991,1992,1995,1997,1999,2002,2005],{},[1523,1993,1994],{},"2",[1523,1996,1540],{},[1523,1998,1525],{},[1523,2000,2001],{},"6",[1523,2003,2004],{},"4414",[1523,2006,2007,2008],{},"6328 > 4414, so ",[1106,2009,2010],{},"left = 7",[1505,2012,2013,2016,2018,2020,2022,2025],{},[1523,2014,2015],{},"3",[1523,2017,1550],{},[1523,2019,1525],{},[1523,2021,1550],{},[1523,2023,2024],{},"6328",[1523,2026,2027,2028],{},"match, return ",[1106,2029,1550],{},[1080,2031,2032,2034,2035,2037,2038,2034,2041,1292,2043,2046,2047,2049],{},[1106,2033,1958],{}," is ",[1106,2036,1575],{}," using integer division, so ",[1106,2039,2040],{},"(7 + 8) \u002F 2",[1106,2042,1550],{},[1106,2044,2045],{},"7.5",". Binary search finds the same index as linear search, ",[1106,2048,1550],{},", after checking 3 elements instead of 8.",[1088,2051,2053],{"id":2052},"step-4-binary-search-for-a-team-thats-missing","Step 4: Binary Search for a Team That's Missing",[1080,2055,1932,2056,1936],{},[1106,2057,2058],{},"findTeamBinary(eventTeams, 5000)",[1499,2060,2061,2085],{},[1502,2062,2063],{},[1505,2064,2065,2067,2071,2075,2079,2083],{},[1508,2066,1945],{},[1508,2068,2069],{},[1106,2070,1328],{},[1508,2072,2073],{},[1106,2074,1332],{},[1508,2076,2077],{},[1106,2078,1958],{},[1508,2080,2081],{},[1106,2082,1963],{},[1508,2084,1966],{},[1518,2086,2087,2104,2121],{},[1505,2088,2089,2091,2093,2095,2097,2099],{},[1523,2090,1973],{},[1523,2092,1976],{},[1523,2094,1525],{},[1523,2096,1530],{},[1523,2098,1983],{},[1523,2100,2101,2102],{},"5000 > 2056, so ",[1106,2103,1989],{},[1505,2105,2106,2108,2110,2112,2114,2116],{},[1523,2107,1994],{},[1523,2109,1540],{},[1523,2111,1525],{},[1523,2113,2001],{},[1523,2115,2004],{},[1523,2117,2118,2119],{},"5000 > 4414, so ",[1106,2120,2010],{},[1505,2122,2123,2125,2127,2129,2131,2133],{},[1523,2124,2015],{},[1523,2126,1550],{},[1523,2128,1525],{},[1523,2130,1550],{},[1523,2132,2024],{},[1523,2134,2135,2136],{},"5000 \u003C 6328, so ",[1106,2137,2138],{},"right = 6",[1080,2140,2141,2142,2034,2144,2146,2147,2034,2149,2151,2152,2154,2155,2157,2158,2160],{},"After check 3, ",[1106,2143,1328],{},[1106,2145,1550],{}," and ",[1106,2148,1332],{},[1106,2150,2001],{},". Since ",[1106,2153,1623],{},", the ",[1106,2156,1619],{}," condition is false, the loop ends, and the method returns ",[1106,2159,1818],{},". It needed 3 checks, where linear search needed 9.",[1099,2162,2164],{"className":1101,"code":2163,"language":1103,"meta":1104,"style":1104},"System.out.println(findTeamBinary(eventTeams, 6328)); \u002F\u002F 7\nSystem.out.println(findTeamBinary(eventTeams, 5000)); \u002F\u002F -1\n",[1106,2165,2166,2171],{"__ignoreMap":1104},[1109,2167,2168],{"class":1111,"line":1112},[1109,2169,2170],{},"System.out.println(findTeamBinary(eventTeams, 6328)); \u002F\u002F 7\n",[1109,2172,2173],{"class":1111,"line":1118},[1109,2174,2175],{},"System.out.println(findTeamBinary(eventTeams, 5000)); \u002F\u002F -1\n",[1088,2177,2179],{"id":2178},"step-5-compare","Step 5: Compare",[1499,2181,2182,2195],{},[1502,2183,2184],{},[1505,2185,2186,2189,2192],{},[1508,2187,2188],{},"Search",[1508,2190,2191],{},"Linear search checks",[1508,2193,2194],{},"Binary search checks",[1518,2196,2197,2206],{},[1505,2198,2199,2202,2204],{},[1523,2200,2201],{},"6328 (present, index 7)",[1523,2203,1525],{},[1523,2205,2015],{},[1505,2207,2208,2211,2214],{},[1523,2209,2210],{},"5000 (not present)",[1523,2212,2213],{},"9",[1523,2215,2015],{},[1080,2217,2218,2219,2222],{},"Both methods give the same answers. Binary search only gets them faster because ",[1106,2220,2221],{},"eventTeams"," is sorted. Each check rules out half of the remaining range, so it can skip the teams on the wrong side of the middle without looking at them.",[1088,2224,2226],{"id":2225},"recap","Recap",[1590,2228,2229,2237,2240,2246],{},[1593,2230,2231,2232,2234,2235,1474],{},"Linear search checks elements in order. A missing target is its worst case, because it has to check all ",[1106,2233,1484],{}," elements before it can return ",[1106,2236,1818],{},[1593,2238,2239],{},"Binary search needs sorted data. Each check compares the target to the middle element and throws away the half that can't contain it.",[1593,2241,2242,2245],{},[1106,2243,2244],{},"middle = (left + right) \u002F 2"," uses integer division, so the result is always a valid index.",[1593,2247,2248,2249,2251,2252,2254,2255,2257],{},"A missing target makes binary search's range run out (",[1106,2250,1623],{},"), which ends the ",[1106,2253,1619],{}," loop and returns ",[1106,2256,1818],{}," instead of looping forever.",[1676,2259,1678],{},{"title":1104,"searchDepth":1118,"depth":1118,"links":2261},[2262,2263,2264,2265,2266,2267,2268],{"id":1703,"depth":1118,"text":1704},{"id":1710,"depth":1118,"text":1711},{"id":1741,"depth":1118,"text":1742},{"id":1822,"depth":1118,"text":1823},{"id":2052,"depth":1118,"text":2053},{"id":2178,"depth":1118,"text":2179},{"id":2225,"depth":1118,"text":2226},{"outlineRef":1690,"pairsWith":2270,"status":2271},"[`lessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms.md`](..\u002F..\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":739,"description":1104},"45ZKz-5qNT3UU88c7E0gyX3v5iYzaz_jap2Qtc9VRXA",{"id":2275,"title":1056,"body":2276,"description":1104,"extension":1688,"meta":3107,"navigation":1215,"path":1055,"seo":3109,"stem":1057,"__hash__":3110},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms.md",{"type":1073,"value":2277,"toc":3102},[2278,2281,2285,2295,2310,2315,2347,2353,2401,2441,2445,2486,2489,2557,2562,2656,2745,2749,2755,2791,2794,2821,2830,2835,2871,2876,2991,2996,3076,3100],[1076,2279,1056],{"id":2280},"searching-algorithms-exercises",[1088,2282,2284],{"id":2283},"multiple-choice","Multiple Choice",[1080,2286,2287,2290,2291,2294],{},[1083,2288,2289],{},"Question:"," A teammate runs the lesson's ",[1106,2292,2293],{},"binarySearch"," method on an array of motor controller IDs that was never sorted. What does this call return?",[1099,2296,2298],{"className":1101,"code":2297,"language":1103,"meta":1104,"style":1104},"int[] controllerIds = {14, 3, 22, 9, 30};\nSystem.out.println(binarySearch(controllerIds, 3));\n",[1106,2299,2300,2305],{"__ignoreMap":1104},[1109,2301,2302],{"class":1111,"line":1112},[1109,2303,2304],{},"int[] controllerIds = {14, 3, 22, 9, 30};\n",[1109,2306,2307],{"class":1111,"line":1118},[1109,2308,2309],{},"System.out.println(binarySearch(controllerIds, 3));\n",[1080,2311,2312],{},[1083,2313,2314],{},"Options:",[1590,2316,2317,2326,2335,2342],{},[1593,2318,2319,2320,2322,2323,2325],{},"A. ",[1106,2321,1973],{},", the index where ",[1106,2324,2015],{}," is stored",[1593,2327,2328,2329,2331,2332,2334],{},"B. ",[1106,2330,1818],{},", even though ",[1106,2333,2015],{}," is in the array",[1593,2336,2337,2338,2341],{},"C. Nothing, because the ",[1106,2339,2340],{},"while"," loop never ends",[1593,2343,2344,2345],{},"D. It throws an ",[1106,2346,1299],{},[1080,2348,2349,2352],{},[1083,2350,2351],{},"Answer:"," B",[1080,2354,2355,2358,2359,2362,2363,2366,2367,2370,2371,2374,2375,2378,2379,2034,2382,2366,2385,2370,2388,2391,2392,2394,2395,2397,2398,2400],{},[1083,2356,2357],{},"Why:"," The first check looks at the middle, ",[1106,2360,2361],{},"controllerIds[2]",", which is ",[1106,2364,2365],{},"22",". Because ",[1106,2368,2369],{},"3 \u003C 22",", the method sets ",[1106,2372,2373],{},"right = 1",", keeping only indexes 0 and 1. The next middle is ",[1106,2376,2377],{},"(0 + 1) \u002F 2 = 0",", and ",[1106,2380,2381],{},"controllerIds[0]",[1106,2383,2384],{},"14",[1106,2386,2387],{},"3 \u003C 14",[1106,2389,2390],{},"right = -1",". Now ",[1106,2393,1623],{},", so the loop ends and the method returns ",[1106,2396,1818],{},". The ",[1106,2399,2015],{}," at index 1 is never checked. Binary search assumes everything left of the middle is smaller and everything right of it is larger. That's only true for sorted data, so on unsorted data it can throw away the half that holds the target.",[1590,2402,2403,2412,2426],{},[1593,2404,2405,2406,2408,2409,2411],{},"A is wrong. ",[1106,2407,2015],{}," really is at index 1, but binary search never looks there. Linear search would return ",[1106,2410,1973],{},", because it checks every element.",[1593,2413,2414,2415,2417,2418,2420,2421,1451,2423,2425],{},"C is wrong. Every check either lowers ",[1106,2416,1332],{}," or raises ",[1106,2419,1328],{},", so the range always shrinks. Once ",[1106,2422,1623],{},[1106,2424,1619],{}," is false and the loop stops. Unsorted data gives a wrong answer, but the loop still ends.",[1593,2427,2428,2429,2431,2432,2146,2434,2436,2437,2440],{},"D is wrong. ",[1106,2430,1958],{}," is always between ",[1106,2433,1328],{},[1106,2435,1332],{},", and the loop only runs while ",[1106,2438,2439],{},"left \u003C= right",", so the method never reads outside the array.",[1088,2442,2444],{"id":2443},"micro-parsons","Micro-Parsons",[1080,2446,2447,2450,2451,2454,2455,2458,2459,2462,2463,2466,2467,2470,2471,1651,2474,2477,2478,2480,2481,2483,2484,1474],{},[1083,2448,2449],{},"Problem:"," Given a ",[1106,2452,2453],{},"SubsystemLookup"," class whose ",[1106,2456,2457],{},"main"," method already creates ",[1106,2460,2461],{},"String[] subsystems = {\"Drivetrain\", \"Intake\", \"Shooter\", \"Climber\"};"," and prints ",[1106,2464,2465],{},"indexOfSubsystem(subsystems, \"Shooter\")",", reorder the fragments below into the ",[1106,2468,2469],{},"indexOfSubsystem"," method. It should do a linear search of ",[1106,2472,2473],{},"subsystems",[1106,2475,2476],{},"name"," and return the index of the match, or ",[1106,2479,1818],{}," if there is no match. The array holds ",[1106,2482,1181],{},"s, so compare them with ",[1106,2485,1185],{},[1080,2487,2488],{},"Reorder the fragments below into the complete method:",[1590,2490,2491,2497,2503,2509,2515,2521,2527,2533,2539,2545,2551],{},[1593,2492,2493,2494],{},"a. ",[1106,2495,2496],{},"        {",[1593,2498,2499,2500],{},"b. ",[1106,2501,2502],{},"    return -1;",[1593,2504,2505,2506],{},"c. ",[1106,2507,2508],{},"public static int indexOfSubsystem(String[] subsystems, String name)",[1593,2510,2511,2512],{},"d. ",[1106,2513,2514],{},"        }",[1593,2516,2517,2518],{},"e. ",[1106,2519,2520],{},"    for (int i = 0; i \u003C subsystems.length; i++)",[1593,2522,2523,2524],{},"f. ",[1106,2525,2526],{},"}",[1593,2528,2529,2530],{},"g. ",[1106,2531,2532],{},"            return i;",[1593,2534,2535,2536],{},"h. ",[1106,2537,2538],{},"    {",[1593,2540,2541,2542],{},"i. ",[1106,2543,2544],{},"        if (subsystems[i].equals(name))",[1593,2546,2547,2548],{},"j. ",[1106,2549,2550],{},"{",[1593,2552,2553,2554],{},"k. ",[1106,2555,2556],{},"    }",[1080,2558,2559,2561],{},[1083,2560,2351],{}," c, j, e, h, i, a, g, d, k, b, f",[1099,2563,2565],{"className":1101,"code":2564,"language":1103,"meta":1104,"style":1104},"public class SubsystemLookup\n{\n    public static int indexOfSubsystem(String[] subsystems, String name)\n    {\n        for (int i = 0; i \u003C subsystems.length; i++)\n        {\n            if (subsystems[i].equals(name))\n            {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    public static void main(String[] args)\n    {\n        String[] subsystems = {\"Drivetrain\", \"Intake\", \"Shooter\", \"Climber\"};\n        System.out.println(indexOfSubsystem(subsystems, \"Shooter\"));\n    }\n}\n",[1106,2566,2567,2572,2576,2581,2585,2590,2594,2599,2603,2608,2612,2616,2621,2625,2629,2634,2638,2643,2648,2652],{"__ignoreMap":1104},[1109,2568,2569],{"class":1111,"line":1112},[1109,2570,2571],{},"public class SubsystemLookup\n",[1109,2573,2574],{"class":1111,"line":1118},[1109,2575,1121],{},[1109,2577,2578],{"class":1111,"line":1124},[1109,2579,2580],{},"    public static int indexOfSubsystem(String[] subsystems, String name)\n",[1109,2582,2583],{"class":1111,"line":1130},[1109,2584,1133],{},[1109,2586,2587],{"class":1111,"line":1136},[1109,2588,2589],{},"        for (int i = 0; i \u003C subsystems.length; i++)\n",[1109,2591,2592],{"class":1111,"line":1142},[1109,2593,1145],{},[1109,2595,2596],{"class":1111,"line":1148},[1109,2597,2598],{},"            if (subsystems[i].equals(name))\n",[1109,2600,2601],{"class":1111,"line":1154},[1109,2602,1253],{},[1109,2604,2605],{"class":1111,"line":1160},[1109,2606,2607],{},"                return i;\n",[1109,2609,2610],{"class":1111,"line":1166},[1109,2611,1264],{},[1109,2613,2614],{"class":1111,"line":1172},[1109,2615,1157],{},[1109,2617,2618],{"class":1111,"line":1261},[1109,2619,2620],{},"        return -1;\n",[1109,2622,2623],{"class":1111,"line":1267},[1109,2624,1163],{},[1109,2626,2627],{"class":1111,"line":1272},[1109,2628,1216],{"emptyLinePlaceholder":1215},[1109,2630,2631],{"class":1111,"line":1277},[1109,2632,2633],{},"    public static void main(String[] args)\n",[1109,2635,2636],{"class":1111,"line":1283},[1109,2637,1133],{},[1109,2639,2640],{"class":1111,"line":1415},[1109,2641,2642],{},"        String[] subsystems = {\"Drivetrain\", \"Intake\", \"Shooter\", \"Climber\"};\n",[1109,2644,2645],{"class":1111,"line":1420},[1109,2646,2647],{},"        System.out.println(indexOfSubsystem(subsystems, \"Shooter\"));\n",[1109,2649,2650],{"class":1111,"line":1426},[1109,2651,1163],{},[1109,2653,2654],{"class":1111,"line":1431},[1109,2655,1175],{},[1080,2657,2658,2661,2662,2665,2666,2669,2670,2673,2674,1451,2677,2680,2681,2684,2685,2687,2688,2690,2691,2693,2694,2697,2698,2701,2702,2705,2706,1451,2709,2712,2713,2697,2716,2719,2720,2723,2724,2726,2727,2730,2731,2734,2735,2737,2738,2740,2741,2744],{},[1083,2659,2660],{},"Why this order:"," The method signature (",[1106,2663,2664],{},"c",") and its opening brace (",[1106,2667,2668],{},"j",") come first. The ",[1106,2671,2672],{},"for"," loop (",[1106,2675,2676],{},"e",[1106,2678,2679],{},"h",") visits each index in order, which is what makes this a linear search. The check (",[1106,2682,2683],{},"i",") goes inside the loop and uses ",[1106,2686,1185],{},", because ",[1106,2689,1189],{}," on ",[1106,2692,1181],{},"s compares identity, not content. When it matches, ",[1106,2695,2696],{},"return i;"," (",[1106,2699,2700],{},"g",") goes inside the ",[1106,2703,2704],{},"if","'s braces (",[1106,2707,2708],{},"a",[1106,2710,2711],{},"d","), since returning as soon as a match is found is fine. ",[1106,2714,2715],{},"return -1;",[1106,2717,2718],{},"b",") has to come after the loop's closing brace (",[1106,2721,2722],{},"k","), because the method can only decide the name is missing after it has checked every element. Putting ",[1106,2725,2715],{}," inside the loop is wrong for two reasons. Java won't compile it, because the method would have no ",[1106,2728,2729],{},"return"," for the case where the loop never runs. And the logic would be wrong anyway: the method would give up after checking only index 0. The method's closing brace (",[1106,2732,2733],{},"f",") comes last. The class and ",[1106,2736,2457],{}," are the given scaffold. The finished program prints ",[1106,2739,1994],{},", since ",[1106,2742,2743],{},"\"Shooter\""," is at index 2.",[1088,2746,2748],{"id":2747},"coding","Coding",[1080,2750,2751,2754],{},[1083,2752,2753],{},"Mode:"," harness",[1080,2756,2757,2759,2760,2763,2764,2767,2768,2771,2772,2775,2776,2779,2780,2783,2784,2786,2787,2790],{},[1083,2758,2449],{}," Pit crews log battery voltage readings (whole numbers, in tenths of a volt) in an\n",[1106,2761,2762],{},"int[][]"," with one row per battery cart, but carts hold different numbers of batteries, so the rows\ncan have ",[1083,2765,2766],{},"different lengths",". Write ",[1106,2769,2770],{},"findFirst",", which searches every row from top to bottom and\neach row from left to right, and returns the position of the ",[1083,2773,2774],{},"first"," cell equal to ",[1106,2777,2778],{},"target"," as a\ntwo-element array ",[1106,2781,2782],{},"{row, col}",". If ",[1106,2785,2778],{}," isn't anywhere in the array, return ",[1106,2788,2789],{},"{-1, -1}",". The\narray itself may have zero rows.",[1080,2792,2793],{},"Examples:",[1590,2795,2796,2805,2812],{},[1593,2797,2798,2801,2802],{},[1106,2799,2800],{},"findFirst(new int[][] { {4, 8}, {15, 16} }, 15)"," returns ",[1106,2803,2804],{},"{1, 0}",[1593,2806,2807,2801,2810],{},[1106,2808,2809],{},"findFirst(new int[][] { {1, 2}, {3, 4} }, 9)",[1106,2811,2789],{},[1593,2813,2814,2801,2817,2820],{},[1106,2815,2816],{},"findFirst(new int[][] { {7, 7}, {7} }, 7)",[1106,2818,2819],{},"{0, 0}"," (the first one found)",[1080,2822,2823,2826,2827],{},[1083,2824,2825],{},"Signature:"," ",[1106,2828,2829],{},"public static int[] findFirst(int[][] grid, int target)",[1080,2831,2832],{},[1083,2833,2834],{},"Starter:",[1099,2836,2838],{"className":1101,"code":2837,"language":1103,"meta":1104,"style":1104},"public class Solution\n{\n    public static int[] findFirst(int[][] grid, int target)\n    {\n        \u002F\u002F TODO: search every row; return {row, col} or {-1, -1}\n    }\n}\n",[1106,2839,2840,2845,2849,2854,2858,2863,2867],{"__ignoreMap":1104},[1109,2841,2842],{"class":1111,"line":1112},[1109,2843,2844],{},"public class Solution\n",[1109,2846,2847],{"class":1111,"line":1118},[1109,2848,1121],{},[1109,2850,2851],{"class":1111,"line":1124},[1109,2852,2853],{},"    public static int[] findFirst(int[][] grid, int target)\n",[1109,2855,2856],{"class":1111,"line":1130},[1109,2857,1133],{},[1109,2859,2860],{"class":1111,"line":1136},[1109,2861,2862],{},"        \u002F\u002F TODO: search every row; return {row, col} or {-1, -1}\n",[1109,2864,2865],{"class":1111,"line":1142},[1109,2866,1163],{},[1109,2868,2869],{"class":1111,"line":1148},[1109,2870,1175],{},[1080,2872,2873],{},[1083,2874,2875],{},"Tests:",[1499,2877,2878,2891],{},[1502,2879,2880],{},[1505,2881,2882,2885,2888],{},[1508,2883,2884],{},"Visible",[1508,2886,2887],{},"Arguments",[1508,2889,2890],{},"Expected",[1518,2892,2893,2908,2922,2936,2951,2964,2977],{},[1505,2894,2895,2898,2903],{},[1523,2896,2897],{},"yes",[1523,2899,2900],{},[1106,2901,2902],{},"new int[][] { {4, 8}, {15, 16} }, 15",[1523,2904,2905],{},[1106,2906,2907],{},"new int[] {1, 0}",[1505,2909,2910,2912,2917],{},[1523,2911,2897],{},[1523,2913,2914],{},[1106,2915,2916],{},"new int[][] { {1, 2}, {3, 4} }, 9",[1523,2918,2919],{},[1106,2920,2921],{},"new int[] {-1, -1}",[1505,2923,2924,2926,2931],{},[1523,2925,2897],{},[1523,2927,2928],{},[1106,2929,2930],{},"new int[][] { {7, 7}, {7} }, 7",[1523,2932,2933],{},[1106,2934,2935],{},"new int[] {0, 0}",[1505,2937,2938,2941,2946],{},[1523,2939,2940],{},"no",[1523,2942,2943],{},[1106,2944,2945],{},"new int[][] { {1}, {2, 3, 9} }, 9",[1523,2947,2948],{},[1106,2949,2950],{},"new int[] {1, 2}",[1505,2952,2953,2955,2960],{},[1523,2954,2940],{},[1523,2956,2957],{},[1106,2958,2959],{},"new int[][] { {5, 6, 7}, {8} }, 9",[1523,2961,2962],{},[1106,2963,2921],{},[1505,2965,2966,2968,2973],{},[1523,2967,2940],{},[1523,2969,2970],{},[1106,2971,2972],{},"new int[][] {}, 3",[1523,2974,2975],{},[1106,2976,2921],{},[1505,2978,2979,2981,2986],{},[1523,2980,2940],{},[1523,2982,2983],{},[1106,2984,2985],{},"new int[][] { {2}, {3, 5}, {5, 5, 5} }, 5",[1523,2987,2988],{},[1106,2989,2990],{},"new int[] {1, 1}",[1080,2992,2993],{},[1083,2994,2995],{},"Solution:",[1099,2997,2999],{"className":1101,"code":2998,"language":1103,"meta":1104,"style":1104},"public class Solution\n{\n    public static int[] findFirst(int[][] grid, int target)\n    {\n        for (int row = 0; row \u003C grid.length; row++)\n        {\n            for (int col = 0; col \u003C grid[row].length; col++)\n            {\n                if (grid[row][col] == target)\n                {\n                    return new int[] {row, col};\n                }\n            }\n        }\n        return new int[] {-1, -1};\n    }\n}\n",[1106,3000,3001,3005,3009,3013,3017,3022,3026,3031,3035,3040,3045,3050,3055,3059,3063,3068,3072],{"__ignoreMap":1104},[1109,3002,3003],{"class":1111,"line":1112},[1109,3004,2844],{},[1109,3006,3007],{"class":1111,"line":1118},[1109,3008,1121],{},[1109,3010,3011],{"class":1111,"line":1124},[1109,3012,2853],{},[1109,3014,3015],{"class":1111,"line":1130},[1109,3016,1133],{},[1109,3018,3019],{"class":1111,"line":1136},[1109,3020,3021],{},"        for (int row = 0; row \u003C grid.length; row++)\n",[1109,3023,3024],{"class":1111,"line":1142},[1109,3025,1145],{},[1109,3027,3028],{"class":1111,"line":1148},[1109,3029,3030],{},"            for (int col = 0; col \u003C grid[row].length; col++)\n",[1109,3032,3033],{"class":1111,"line":1154},[1109,3034,1253],{},[1109,3036,3037],{"class":1111,"line":1160},[1109,3038,3039],{},"                if (grid[row][col] == target)\n",[1109,3041,3042],{"class":1111,"line":1166},[1109,3043,3044],{},"                {\n",[1109,3046,3047],{"class":1111,"line":1172},[1109,3048,3049],{},"                    return new int[] {row, col};\n",[1109,3051,3052],{"class":1111,"line":1261},[1109,3053,3054],{},"                }\n",[1109,3056,3057],{"class":1111,"line":1267},[1109,3058,1264],{},[1109,3060,3061],{"class":1111,"line":1272},[1109,3062,1157],{},[1109,3064,3065],{"class":1111,"line":1277},[1109,3066,3067],{},"        return new int[] {-1, -1};\n",[1109,3069,3070],{"class":1111,"line":1283},[1109,3071,1163],{},[1109,3073,3074],{"class":1111,"line":1415},[1109,3075,1175],{},[1080,3077,3078,3080,3081,3084,3085,3088,3089,3092,3093,3096,3097,3099],{},[1083,3079,2357],{}," This is linear search with a nested loop. The inner bound is ",[1106,3082,3083],{},"grid[row].length",", the length\nof the row currently being searched. Using ",[1106,3086,3087],{},"grid[0].length"," would skip the extra cells in a longer\nrow (the ",[1106,3090,3091],{},"{ {1}, {2, 3, 9} }"," test) or run off the end of a shorter row (the ",[1106,3094,3095],{},"{ {5, 6, 7}, {8} }","\ntest). Returning inside the loop stops at the first match, and ",[1106,3098,2789],{}," after both loops means\nevery cell was checked and none matched.",[1676,3101,1678],{},{"title":1104,"searchDepth":1118,"depth":1118,"links":3103},[3104,3105,3106],{"id":2283,"depth":1118,"text":2284},{"id":2443,"depth":1118,"text":2444},{"id":2747,"depth":1118,"text":2748},{"outlineRef":1690,"pairsWith":2270,"status":3108},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":1056,"description":1104},"nkCMC0RBa_hSHANaja6SOwNeaFtt9CnShg567HAJtkA",1792718166860]