Peter Andreae Computer Science Victoria University of Wellington Copyright: Peter Andreae, Victoria University of Wellington Arrays with meaningful indices COMP 102 # T1
© Peter Andreae Menu Arrays with Meaningful Indices Assignment 8 BalloonGame Genealogy Administrivia: Friday: IT careers fair. 12-2, AM foyer Test: pick up from School office (9am-2pm, Tue-Fri) COMP :2
© Peter Andreae Can’t use “foreach” everywhere Can’t use to change the values in the array for (int i = 0 ; i < data.length ; i = i++) { data[ i ] = data[i] * 2; } for (int value : data) { value = value * 2; } If array contains objects, you can modify the objects: (but not change them!) for (Shape sh : shapes) { sh.setColor(Color.white); } data: value: shapes: sh: c: red x: y: c: blue x: y: COMP :3
© Peter Andreae Arrays with Meaningful Indices Arrays to store a collection: index doesn't mean anything Sometimes, index represents meaningful information array of guest names for hotel rooms (numbered 1 to MaxRoom) house info for each house on street count of occurrences of each number image p1p1 count: 7 p5p5 p3p3 p8p8 p2p2 p6p6 p4p4 data: n1n1 n5n5 n8n8 n 10 n7n7 n3n3 n6n6 n4n s1s1 null s5s5 s3s3 s8s8 s2s2 s6s6 s9s9 names: COMP :4
© Peter Andreae Hotel Register initialise empty private String[ ] guests = new String[MaxRoom+1]; // gives indexes from 0 to MaxRoom, ignore index 0 assign to room public void assign(String name; int room){ this.guests[room] = name; } look up to see if empty public boolean isEmpty(int room){ return (this.guests[room]==null); } n1n1 n5n5 n8n8 n 10 n7n7 n3n3 n6n6 n4n4 guests: Don ’ t need to search COMP :5
© Peter Andreae Hotel Register: remove Checkout guest from room /* returns true if name was checked out of room successfully, false otherwise */ public boolean checkout(String name, int room){ if ( this.guests[room].equals(name) ){ this.guests[room] = null; return true; } return false; } if ( this.guests[room] != null && this.guests[room].equals(name) ) … if ( name.equals(this.guests[room]) ) … What ’ s the problem? How do we fix it? n1n1 n5n5 n8n8 n 10 n7n7 n3n3 n6n6 n4n4 guests: COMP :6
© Peter Andreae Alternative Checkout guest: search and remove: /* returns true if name was checked out successfully, false otherwise */ public boolean checkout(String name){ for (int r=1; r<this.guests.length; r++){ // or <=MaxRoom if (this.guests[r] != null ){ if (this.guests[r].equals(name) { this.guests[r] = null; return true; } return false; } n1n1 n5n5 n8n8 n 10 n7n7 n3n3 n6n6 n4n4 guests: COMP :7
© Peter Andreae Find an empty room Find the index of an empty room public int findEmpty(int room){ for (int r=1; r<this.guests.length; r++){// or <=MaxRoom if (this.guests[r]==null) { return r; } } return -1; } Check a guest into an empty room (return room number) public void checkIn(String name){ this.guests[ this.findEmpty() ] = name; } public boolean checkIn(String name){ int r = this.findEmpty(); if (r < 0) { return false; } this.guests[r] = name; return true; } What ’ s the problem? How do we fix it? n1n1 n5n5 n8n8 n 10 n7n7 n3n3 n6n6 n4n4 guests: COMP :8
© Peter Andreae Arrays of Counts (for histogram) to keep track of counts of numbers we have seen Scanner sc = new Scanner(new File(… )); int [ ] counts= new int[maxValue+1]; int otherCount= 0; while ( sc.hasNextInt() ){ int num = sc.nextInt(); if ( num>=0 && num<=maxValue ) { counts[num] ++; } else { otherCount++; } … otherCount: max … 0 counts: COMP :9
© Peter Andreae Arrays of Booleans keeping track of numbers we have seen, efficiently looking for duplicates: read file, check and set Scanner sc = new Scanner(new File( … )); boolean[ ] numbersSeen = new boolean[100000]; while ( sc.hasNext() ){ if ( sc.hasNextInt() ){ int num = sc.nextInt(); if ( num>=0 && num< ){ if (numbersSeen[num] ) { System.out.println(num + "is a duplicate"); } numbersSeen[num] = true; } else { sc.next(); } } Initialised with false fffffffff … fffffff numbersSeen: … COMP :10
© Peter Andreae Assignment 8 BalloonGame Array of Balloon objects Remove from array when popped Scoring: COMP :11
© Peter Andreae Balloon Class: touching public class Balloon{ private int radius = 10; private int centerX, centerY; private Color color; /** Returns true if this ball is touching the other ball, and false otherwise */ public boolean colliding(Balloon other){ double dx = other.centerX - this.centerX; double dy = other.centerY - this.centerY; double dist = other.radius + this.radius; return (Math.hypot(dx, dy) <= dist); } COMP :12
© Peter Andreae Assignment 8 Genealogy File of genealogical data Array of Person Current 10 6 Angel Alex Addison Devin Jordan Jessie Alexis Kasey Kelly Dominique db: ID: 6 name: Angel dob: 1805 motherID: -1 fatherID: -1 ID: 3 name: Alex dob: 1840 motherID: 6 fatherID: 0 ID: 5 name: Addison dob: 1907 motherID: 3 fatherID: 7 ID: 0 name: Devin dob: 1810 motherID: -1 fatherID: -1 COMP :13
© Peter Andreae Genealogy COMP :14