Arrays and Array Lists CS 21a.

Slides:



Advertisements
Similar presentations
Class Relationships Part 1: Composition and Association CS 21a: Introduction to Computing I First Semester,
Advertisements

Introduction to Object-Oriented Programming CS 21a: Introduction to Computing I First Semester,
Arrays.
CIT 590 Intro to Programming Java lecture 4. Agenda Types Collections – Arrays, ArrayLists, HashMaps Variable scoping Access modifiers – public, private,
Chapter 7 – Arrays.
1 Lecture Today’s topic Arrays Reading for this Lecture: –Chaper 11.
1 Arrays  Arrays are objects that help us organize large amounts of information  Chapter 8 focuses on: array declaration and use passing arrays and array.
Class design. int month; int year class Month Defining Classes A class contains data declarations (state) and method declarations (behaviors) Data declarations.
Previous Exam 1.0. Question 1 - a Is the following statement true or false? Briefly explain your answer. A && B is the same as B && A for any Boolean.
Options for User Input Options for getting information from the user –Write event-driven code Con: requires a significant amount of new code to set-up.
Java Programming Review (Part I) Enterprise Systems Programming.
Java Unit 9: Arrays Declaring and Processing Arrays.
Data Objects (revisited) Recall that values are stored in data objects, and that each data object holds one value of a particular type. Data objects may.
Introduction to Object-Oriented Programming
CSC Programming I Lecture 8 September 9, 2002.
By Nicholas Policelli An Introduction to Java. Basic Program Structure public class ClassName { public static void main(String[] args) { program statements.
French Territory of St. Pierre CSE 114 – Computer Science I Arrays.
Spring 2008 Mark Fontenot CSE 1341 Principles of Computer Science I Note Set 2.
Loops: Handling Infinite Processes CS 21a: Introduction to Computing I First Semester,
Classes CS 21a: Introduction to Computing I First Semester,
Arrays Module 6. Objectives Nature and purpose of an array Using arrays in Java programs Methods with array parameter Methods that return an array Array.
Arrays Chapter 8. What if we need to store test scores for all students in our class. We could store each test score as a unique variable: int score1.
ARRAYS Computer Engineering Department Java Course Asst. Prof. Dr. Ahmet Sayar Kocaeli University - Fall
The while Loop Syntax while (condition) { statements } As long condition is true, the statements in the while loop execute.
OBJECTS FOR ORGANIZING DATA -- As our programs get more sophisticated, we need assistance organizing large amounts of data. : array declaration and use.
Lecture 101 CS110 Lecture 10 Thursday, February Announcements –hw4 due tonight –Exam next Tuesday (sample posted) Agenda –questions –what’s on.
Odds and Ends. CS 21a 09/18/05 L14: Odds & Ends Slide 2 Copyright © 2005, by the authors of these slides, and Ateneo de Manila University. All rights.
Using Objects. 6/28/2004 Copyright 2004, by the authors of these slides, and Ateneo de Manila University. All rights reserved L7: Objects Slide 2 Java.
©SoftMoore ConsultingSlide 1 Generics “Generics constitute the most significant change in the Java programming language since the 1.0 release.” – Cay Horstmann.
Arrays and Lists: Handling Infinite Data CS 21a: Introduction to Computing I First Semester,
Arrays and ArrayLists Topic 6. One Dimensional Arrays Homogeneous – all of the same type Contiguous – all elements are stored sequentially in memory For.
Arrays and Array Lists CS 21a. Problem 1: Reversing Input Problem: Read in three numbers and then print out the numbers in reverse order Straightforward.
Outline Anatomy of a Class Encapsulation Anatomy of a Method Graphical Objects Graphical User Interfaces Buttons and Text Fields Copyright © 2012 Pearson.
Chapter 9 Introduction to Arrays Fundamentals of Java.
Chapter 8 Arrays and the ArrayList Class Arrays of Objects.
Arrays Chapter 7.
Chapter VII: Arrays.
Computer Organization and Design Pointers, Arrays and Strings in C
Chapter 7 – Arrays and Array Lists
Sixth Lecture ArrayList Abstract Class and Interface
User-Written Functions
Principles of Computer Science I
Arrays.
[ 4.00 ] [ Today’s Date ] [ Instructor Name ]
C Programming Tutorial – Part I
Chapter 7 Part 1 Edited by JJ Shepherd
Chapter-7 part3 Arrays Two-Dimensional Arrays The ArrayList Class.
Arrays Part 1 Topic 19 - Stan Kelly-Bootle
CSC 142 Computer Science II
CSC141 Computer Science I Zhen Jiang Dept. of Computer Science
Object Oriented Programming COP3330 / CGS5409
Writing Methods AP Computer Science A.
Building Java Programs
Chapter 8 Slides from GaddisText
Arrays We often want to organize objects or primitive data in a way that makes them easy to access and change. An array is simple but powerful way to.
Anatomy of a Method.
Defining methods and more arrays
Object Oriented Programming in java
Chapter 6 Array-Based Lists.
CS2011 Introduction to Programming I Arrays (I)
slides created by Ethan Apter
Arrays.
Building Java Programs
JAVA CLASSES.
Classes CS 21a: Introduction to Computing I
Introduction to Object-Oriented Programming
Dr. Sampath Jayarathna Cal Poly Pomona
Building Java Programs
Corresponds with Chapter 5
Arrays.
Presentation transcript:

Arrays and Array Lists CS 21a

Reversing Input public static void main( String args[] ) { Scanner in = new Scanner(System.in); System.out.println( “Numbers:" ); double num1; double num2; double num3; num1 = in.nextDouble(); num2 = in.nextDouble (); num3 = in.nextDouble (); System.out.println( “Reverse:" ); System.out.println( num3 ); System.out.println( num2 ); System.out.println( num1 ); } Problem: Read in three numbers and then print out the numbers in reverse order Straightforward Java application declare three variables of type double read in the values using the Scanner object print them out starting with the last variable read in

Generalizing a Program Suppose we wanted the same program but wanted 10 instead of 3 numbers? Suppose we wanted to read in 1000 numbers? More than 3000 lines of code if we used the same approach! Solution: arrays

Arrays Definition In Java, collection of elements of the same type each element is accessed through an index In Java, declaration: double[] nums; creation: nums = new double[8]; use: nums[3] = 6.6; Note: starting index is 0 (0 to 7, above) double nums[] is also legal, but double[] nums is preferred, since it emphasizes that the type is double[] (“double array” or “array of doubles”)

Visualizing an Array nums null Declare: double[] nums;

Visualizing an Array nums null Declare: double[] nums; 0.0 1 2 3 4 5 6 7 null Declare: double[] nums; Create: nums = new double[8];

Visualizing an Array nums 6.6 Declare: double[] nums; 0.0 1 2 3 4 5 6 7 6.6 Declare: double[] nums; Create: nums = new double[8]; Use: nums[3] = 6.6;

Reversing 10 numbers Use arrays declare double[] nums create new double[10] use indices 0, 1, 2 when referring to the different array elements Statements still look redundant (how about using loops?) public static void main( String args[] ) { Scanner in = new Scanner(System.in); System.out.println( “Numbers:" ); double[] nums; nums = new double[3]; nums[0] = in.nextDouble(); nums[1] = in.nextDouble(); nums[2] = in.nextDouble(); System.out.println( “Reverse:" ); System.out.println( nums[2] ); System.out.println( nums[1] ); System.out.println( nums[0] ); }

Reversing 10 numbers (2) Use arrays and loops declare double[] nums create new double[10] use a for-statement to read in the numbers use a for-statement to print them out in reverse public static void main( String args[] ) { Scanner in = new Scanner(System.in); System.out.println( “Numbers:" ); double[] nums; nums = new double[3]; for( int i = 0; i < 3; i++ ) nums[i] = in.nextDouble(); System.out.println( “Reverse:" ); for( int i = 2; i >= 0; i-- ) System.out.println( nums[i] ); }

Scaling up What if you want to change the number of elements? would have to find and change all places using 10 (including the 9 in the for loop) very tedious and error-prone public static void main( String args[] ) { Scanner in = new Scanner(System.in); System.out.println( “Numbers:" ); double[] nums; nums = new double[10]; for( int i = 0; i < 10; i++ ) nums[i] = in.nextDouble(); System.out.println( “Reverse:" ); for( int i = 9; i >= 0; i-- ) System.out.println( nums[i] ); }

Reversing 10 numbers (3) Use a constant to indicate the array size Use that constant in the for loops Just need to change one portion of the program when scaling up public static final int MAX = 3; public static void main( String args[] ) { Scanner in = new Scanner(System.in); System.out.println( “Numbers:" ); double[] nums; nums = new double[MAX]; for( int i = 0; i < MAX; i++ ) nums[i] = in.nextDouble(); System.out.println( “Reverse:" ); for( int i = MAX-1; i >= 0; i-- ) System.out.println( nums[i] ); }

Constants and “Magic Numbers” Constants are useful for “magic numbers” – i.e., specific values that are used throughout the code e.g., MAX_LENGTH, SCREEN_WIDTH, PI, BLUE, DASHED_LINE, etc. Useful because makes code more readable and maintainable e.g., WHITE is easier to understand and easier to remember than 255 makes modifications easier e.g., in reversing program example, we just need to change MAX. No need to look for 10 and 9 and change them.

Problem 2: Collection of Objects How can we write Bank so it can handle a larger number of BankAccounts? Right now, we can only handle a small number of accounts (2 or 3) withdraw( “Alice”, 200 ) getBalance( “Bob” )

Solution: Array of Objects Declaration BankAccount[] accounts; Creation of the Array accounts = new BankAccount[5]; creates an array of references to BankAccounts but no actual BankAccounts yet Creation of Objects for ( i = 0; i < 5; i++ ) { accounts[i] = new BankAccount(); } creates the BankAccounts themselves and assigns these to the references

Visualizing an Array of Objects accounts null Declare: BankAccount[] accounts;

Visualizing an Array of Objects 1 2 3 4 null BankAccount-type references accounts null Declare: BankAccount[] accounts; Create array: accounts = new BankAccount[5];

Visualizing an Array of Objects BankAccount-type references BankAccount balance acounts null null BankAccount balance 10 1 null Declare: BankAccount[] accounts; BankAccount balance 20 2 null BankAccount balance 30 null Create array: accounts = new BankAccount[5]; 3 4 BankAccount balance 40 null Create objects: for ( i = 0; i < 5; i++ ) { accounts[i] = new BankAccount(i * 10); }

Visualizing an Array of Objects BankAccount-type references BankAccount balance acounts null null BankAccount balance 10 1 null Declare: BankAccount[] accounts; BankAccount balance 20 2 null BankAccount balance 30 null Create array: accounts = new BankAccount[5]; 3 4 BankAccount balance 40 null Create objects: for ( i = 0; i < 5; i++ ) { accounts[i] = new BankAccount(i * 10); } Use objects: e.g., accounts[3].getBalance(); (returns 30)

Approach Include an acctName field in BankAccount Add a constructor that allows you to indicate name and balance Add a getAcctName() method Declare an array of BankAccount objects in Bank Create the array inside Bank’s constructor Loop through the array to find a matching account before carrying out the transaction (deposit, withdraw, getBalance)

Approach public class BankAccount { private double balance; private String acctName; public BankAccount( String name, double initBalance ) acctName = name; balance = initBalance; } public String getAcctName() return acctName; … A field representing the account name has been added: acctName Constructor that accepts a name and an initial balance Get method to access acctName

Approach A field representing an array of BankAccounts added: accounts There is also a constant representing the maximum amount of BankAccounts the bank can handle: MAX The array is initialized in the constructor. It is also populated with 2 BankAccount objects named “john” and “marsha” public class Bank { private BankAccount[] accounts; private static final int MAX = 10; public Bank() accounts = new BankAccount[MAX]; accounts[0] = new BankAccount(“john”, 100); accounts[1] = new BankAccount(“marsha”,200); } …

The deposit method public class Bank { … public void deposit( String name, double amt ) { BankAccount temp = null; for( int x = 0; x < MAX; x++ ) if( accounts[x].getAcctName().equals(name) ) temp = accounts[x]; } if ( temp != null ) temp.deposit( amt ); First, loop through the accounts array to find a matching bank account object The getAcctName() method is used to get the name of an account and compare it with the name argument passed

The deposit method public class Bank { … public void deposit( String name, double amt ) { BankAccount temp = null; for( int x = 0; x < MAX; x++ ) if( accounts[x].getAcctName().equals(name) ) temp = accounts[x]; } if ( temp != null ) temp.deposit( amt ); First, loop through the accounts array to find a matching bank account object The getAcctName() method is used to get the name of an account and compare it with the name argument passed Be careful when writing code like this. Doing this gives a NullPointerException if no BankAccount instance is assigned to that location.

The deposit method version 2 public class Bank { … public void deposit( String name, double amt ) { BankAccount temp = null; for( int x = 0; x < MAX; x++ ) { if ( accounts[x] != null ) { if( accounts[x].getAcctName().equals(name) ) { temp = accounts[x]; } if ( temp != null ) temp.deposit( amt ); check first if the location contains an instance of BankAccount (i.e., not null)

The deposit method version 3 public class Bank { … public void deposit( String name, double amt ) { BankAccount temp = null; for( int x = 0; x < numAccounts; x++ ) if( accounts[x].getAcctName().equals(name) ) temp = accounts[x]; } if ( temp != null ) temp.deposit( amt ); Another alternative is to change the limit of x to the actual number of accounts the array contains.

Approach What is the value of numAccounts? public class Bank { private BankAccount[] accounts; private static final int MAX = 10; private int numAccounts = 0; public Bank() accounts = new BankAccount[MAX]; accounts[0] = new BankAccount(“john”, 100); accounts[1] = new BankAccount(“marsha”,200); numAccounts = 2; } …

Creating new BankAccounts public void openAccount( String name, int initbal ) { if ( numAccounts < MAX ) accounts[numAccounts] = new BankAccount( initbal ); accounts[numAccounts].setAcctName( name ); numAccounts++; } else System.out.println( "Maximum number of accounts reached" );

Using openAccount as a convenience method In the Bank’s constructor: public Bank() { accounts = new BankAccount[MAX]; openAccount( "john", 1000 ); openAccount( "marsha", 2000 ); } Better yet, just make calls to openAccount from the driver program, so that a newly created Bank object contains no accounts

The withdraw method public class Bank { … public void withdraw( String name, double amt ) { BankAccount temp = null; for( int x = 0; x < numAccounts; x++ ) if( accounts[x].getAcctName().equals(name) ) temp = accounts[x]; } if ( temp != null ) temp.withdraw( amt ); Notice that the code is almost identical to the code in the deposit method, except for the last line. How do we eliminate this redundancy?

The findAccount method() public class Bank { … private BankAccount findAccount( String name ) for(int x = 0; x < numAccounts; x++) if( accounts[x].getAcctName().equals(name) ) return accounts[x]; } return null; This method can be called from deposit, withdraw and getBalance

Using findAccount() public class Bank { … public void deposit( String name, double amt ) { BankAccount temp = findAccount( name ); if ( temp != null ) temp.deposit( amt ); } public void withdraw( String name, double amt ) temp.withdraw( amt ); Exercise: write code for the getBalance method

More About Arrays Arrays are objects Special features the array variable is just a reference to the actual array that contains the values need to use “new” after declaring passed as a reference when used as method parameter Special features a public final int length field returns the array size in recent example, accounts.length would return 10 [] operator only work with arrays

More About Arrays ArrayIndexOutOfBounds exception valid indices for array of size n: 0 to n-1 any access to other indices causes an error Array size can’t be changed after array is created To expand array, we need to create a new array, copy old array contents, then point array variable to new array

Array Initializers You can initialize an array with the following syntax: String[] responses = { “Hello”, “Hi”, “How are you”, “How do you do” }; Can be used for fields, local variables, and even constants

Useful Pattern Put different responses for different cases in an array String[] responses = { “Hello”, “Hi”, “How are you”, “How do you do” }; Assign an integer to represent different cases In this case 0 means the program will say “Hello”, 1 means it will say “Hi”, etc. Now you can generate the data for each case accordingly e.g., What does the following code do? int greetingCase = (int) ( Math.random() * responses.length ); String greeting = responses[greetingCase] + “World”; System.out.println( greeting );

Command line arguments Try this program: public class Command { public static void main( String[] args ) { System.out.println( “Hi,” + args[0] ); } } Execute the program outside of BlueJ, through the command line: C> java Command bob Hi, bob

Command line arguments The String[] args parameter in the main program represents the words you specify in addition to the to java and the program name (e.g., Command) args[0] refers to the first argument, args[1] refers to the second argument, and so on… Use args.length to find out how many arguments are indicated In BlueJ, when you after right-click on the Java class and execute main, you may include arguments as well

Multi-dimensional Arrays A natural extension of simple (1D) arrays 2D declaration: char[][] grid; think “array of arrays” Array creation grid = new char[10][20]; // 10 rows, 20 columns Another way grid = new char[10][]; // creates array of 10 char[]’s for (i = 0; i < 10; i++) { grid[i] = new char[20]; // creates a size-20 array } This way allows for varying row sizes

Visualizing 2D Arrays char[][] null Declare: char[][] grid; C 1 2 3 4 char[]-type references char[][] null Declare: char[][] grid; C Create array of rows: grid = new char[5][]; Create rows: for ( i = 0; i < 5; i++ ) { grid[i] = new char[3]; } Use objects: e.g., grid[3][2] = ‘C’

Using 2D Arrays To refer to individual element, use two indices e.g., grid[2][1] = ‘X’; Using only one index refers to a single dimensional array e.g., grid[4] refers to row 4 grid[4].length is the length of row 4 (in this case, it’s 3) The array variable by itself refers to the top-level array (i.e., the array of rows) grid.length is the length of the array of rows (i.e., it’s the number of rows)

Problem 3, Flexible collections How can we write Bank so it can have an arbitrary number of BankAccounts? Right now, with arrays, we can only handle a fixed number of accounts (up to MAX accounts) withdraw( “Alice”, 200 ) getBalance( “Bob” )

The Java Collections Framework A set of classes that you can use for containing arbitrarily large collections of objects To use, you must say import java.util.*; at the top of your code Some basic Collections classes ArrayList, Vector HashMap, Hashtable

ArrayList Indexed list of objects that automatically resizes ArrayList<String> names Indexed list of objects that automatically resizes The list is ordered, with each object in the list having an index, from 0 to n-1 Most commonly used methods boolean add( E element ) int size() E get( int index ) E set( int index, E element ) plus others (see API docs) ArrayList “Bart” 1 “Lisa” 2 “Maggie” Note: ArrayLists in Java 5 is used slightly differently from its previous versions.

ArrayList Example ArrayList<String> names ArrayList “Bart” import java.util.*; public class ArrayListDemo1 { public static void main( String[] args) ArrayList<String> names = new ArrayList<String>(); names.add( "Bart" ); names.add( "Lisa" ); names.add( "Maggie" ); for ( int i = 0; i < names.size(); i++ ) System.out.println( names.get( i ) ); } names.set( 1, "Homer" ); names.add( "Marge" ); ArrayList You have to specify the type of object it has to store. “Bart” 1 “Lisa” “Homer” 2 “Maggie” 3 “Marge”

Using Other Types ArrayList accts ArrayList BankAccount 2000 “Alice” import java.util.*; public class ArrayListDemoWithBankAccounts { public static void main( String[] args) ArrayList<BankAccount> accts = new ArrayList<BankAccount>(); accts.add( new BankAccount( “Alice”, 2000 ) ); accts.add( new BankAccount( “Bob”, 1000 ) ); for ( int i = 0; i < accts.size(); i++ ) BankAccount curAccount = accts.get( i ); System.out.println( "Bank Account #" + i + "Owner: " + curAccount.getAcctName() + ", " + "Balance: " + curAccount.getBalance() ); } ArrayList “Alice” BankAccount int balance 2000 String name 1 BankAccount int balance 1000 String name “Bob”

Looping through ArrayLists Using an index … for ( int i = 0; i < accts.size(); i++ ) { BankAccount curAccount = accts.get( i ); System.out.println( … ); } Using an “enhanced for” … for ( BankAccount b : accts ) System.out.println( b.getBalance() ); Simpler than a regular for loop. All you have to specify is the object (BankAccount) and the ArrayList (accts).