0% found this document useful (0 votes)
41 views

Chapter 7 ArrayList

ArrayList<String> names2 = new ArrayList<String>(); names2.add("Bob"); names2.add("Cindy"); append(names1, names2); System.out.println(names1); System.out.println(names2); Answer: names1 contains ["Emily", "Bob", "Cindy"] names2 contains ["Bob", "Cindy"] The append method adds elements from the source list to the target list without modifying the source list.

Uploaded by

King Ali
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
41 views

Chapter 7 ArrayList

ArrayList<String> names2 = new ArrayList<String>(); names2.add("Bob"); names2.add("Cindy"); append(names1, names2); System.out.println(names1); System.out.println(names2); Answer: names1 contains ["Emily", "Bob", "Cindy"] names2 contains ["Bob", "Cindy"] The append method adds elements from the source list to the target list without modifying the source list.

Uploaded by

King Ali
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 33

Array Lists

An array list stores a sequence of values whose size can change.


An array list can grow and shrink as needed.
ArrayList class supplies methods for many common tasks, such as inserting
and removing elements.
An array list expands to hold as many elements as needed.
Syntax 7.4 Array Lists
Declaring and Using Array Lists
To declare an array list of strings
ArrayList<String> names = new ArrayList<String>();

To use an array list

import java.util.ArrayList ;

ArrayList is a generic class


Angle brackets denote a type parameter
Replace String with any other class to get a different array list type
Declaring and Using Array Lists
ArrayList<String> is first constructed, it has size 0
Use the add method to add an object to the end of the array list:

names.add("Emily"); // Now names has size 1 and


element "Emily" names.add("Bob"); // Now names has
size 2 and elements "Emily", "Bob" names.add("Cindy");
// names has size 3 and elements "Emily", "Bob", and
"Cindy"

The size method gives the current size of the array list.
Size is now 3

Figure 17 Adding an Array List Element with add


Declaring and Using Array Lists
To obtain an array list element, use the get method
Index starts at 0

To retrieve the name with index 2:

String name = names.get(2); // Gets the third element of the array list

The last valid index is names.size() - 1


A common bounds error:

int i = names.size();
name = names.get(i); // Error

To set an array list element to a new value, use the set method:

names.set(2, "Carolyn");
Declaring and Using Array Lists
An array list has methods for adding and removing elements in the middle.

This statement adds a new element at position 1 and moves all elements
with index 1 or larger by one position.

names.add(1, "Ann")

The remove method,


removes the element at a given position
moves all elements after the removed element down by one position
and reduces the size of the array list by 1.

names.remove(1);

To print an array list:


System.out.println(names); // Prints [Emily, Bob, Carolyn]
Declaring and Using Array Lists

Figure 18 Adding and Removing Elements in the Middle of an Array List


Using the Enhanced for Loop with Array Lists
You can use the enhanced for loop to visit all the elements of an array list

ArrayList<String> names = . . . ;
for (String name : names)
{
System.out.println(name);
}

This is equivalent to:

for (int i = 0; i < names.size(); i++)


{
String name =
names.get(i);
System.out.println(name);
}
Copying Array Lists
Copying an array list reference yields two references to the same array list.
After the code below is executed
Both names and friends reference the same array list to which the string "Harry" was added.
ArrayList<String> friends = names;
friends.add("Harry");

Figure 19 Copying an Array List Reference

To make a copy of an array list, construct the copy and pass the original list into
the constructor:
ArrayList<String> newNames = new ArrayList<String>(names);
Working with Array Lists

ArrayList<String> names = Constructs an empty array list that can hold


new strings.
ArrayList<String>();

names.add("Ann"); Adds elements to the end.


names.add("Cindy");
Prints [Ann, Cindy].
System.out.println(names);

names.add(1, "Bob"); Inserts an element at index 1. names is now [Ann, Bob, Cindy].

names.remove(0);
Removes the element at index 0. names is now [Bob, Cindy].

names.set(0, "Bill"); Replaces an element with a different value. names is now [Bill, Cindy].

Gets an element.
String name = names.get(i);

String last = names.get(names.size() - 1);


Gets the last element.

ArrayList<Integer>
squares = new
ArrayList<Integer>(); for
(int i = 0; i < 10; i++)
{
squares.add(i * i); Constructs an array list holding the first ten
}
squares.
Wrapper Classes
You cannot directly insert primitive type values into array lists.
Like truffles that must be in a wrapper to be sold, a number must be placed in
a wrapper to be stored in an array list.

Use the matching wrapper class.


Wrapper Classes
To collect double values in an array list, you use an ArrayList<Double>.
if you assign a double value to a Double variable, the number is automatically
“put into a box”
Called auto-boxing:
Automatic conversion between primitive types and the corresponding wrapper classes:
Double wrapper = 29.95;

Wrapper values are automatically “unboxed” to primitive types


double x = wrapper;

Figure 20 A Wrapper Class Variable


Using Array Algorithms with Array Lists
The array algorithms can be converted to array lists simply by using the array list
methods instead of the array syntax.
Code to find the largest element in an array:
double largest = values[0];
for (int i = 1; i < values.length; i++)
{
if (values[i] > largest)
{
largest = values[i];
}
}

Code to find the largest element in an array list


double largest = values.get(0);
for (int i = 1; i < values.size(); i++)
{
if (values.get(i) > largest)
{
largest = values.get(i);
}
}
Storing Input Values in an Array List
To collect an unknown number of inputs, array lists are much easier to use than
arrays.
Simply read the inputs and add them to an array list:
ArrayList<Double> inputs = new ArrayList<Double>(); while
(in.hasNextDouble())
{
inputs.add(in.nextDouble());
}
Removing Matches
To remove elements from an array list, call the remove method.
Error: skips the element after the moved element
ArrayList<String> words = ...;
for (int i = 0; i < words.size(); i++)
{
String word = words.get(i); if
(word.length() < 4)
{
Remove the element at index i.
}
}

Concrete example

Should not increment i when an element is removed


Removing Matches
Pseudocode
If the element at index i matches the condition
Remove the element.
Else
Increment i.

Use a while loop, not a for loop


int i = 0;
while (i < words.size())
{
String word = words.get(i); if
(word.length() < 4)
{
words.remove(i);
}
else
{
i++;
}
}
Choosing Between Array Lists and Arrays
For most programming tasks, array lists are easier to use than arrays
Array lists can grow and shrink.
Arrays have a nicer syntax.

Recommendations
If the size of a collection never
changes, use an array.
If you collect a long sequence of primitive type values and you are concerned about efficiency,
use an array.
Otherwise, use an array list.
Choosing Between Array Lists and Arrays
section_7/LargestInArrayList.java

1 import java.util.ArrayList;
2 import java.util.Scanner;
3
4 /**
5 This program reads a sequence of values and prints them, marking the largest
value.
6 */
7 public class LargestInArrayList
8 {
9 public static void main(String[] args)
10 {
11 ArrayList<Double> values = new ArrayList<Double>();
12 // Read
13 inputs
14 System.out.println("Please enter values, Q to quit:");
15 Scanner in = new Scanner(System.in);
16 while (in.hasNextDouble())
17 {
18 values.add(in.nextDouble());
19 }
20
21 // Find the largest
22 value
23 double largest = values.get(0);
24 for (int i = 1; i < values.size(); i++)
25 {
26 if (values.get(i) > largest)
27 {
28 largest = values.get(i);
29 }
30 }
31
32 // Print all values, marking the
33 largest
34
Program
35 Run:
for (double element : values)

Please enter values, Q to quit: 35 80 115 44.5


Q
35 80
115 <== largest value
44.5
Self Check 7.35
Declare an array list primes of integers that contains the first five prime numbers (2, 3, 5, 7, and 11).

Answer:
ArrayList<Integer> primes = new ArrayList<Integer>(); primes.add(2);
primes.add(3);
primes.add(5);
primes.add(7);
primes.add(11);
Self Check 7.36
Given the array list primes declared in Self Check 35, write a loop to print its elements in reverse order,
starting with the last element.

Answer:
for (int i = primes.size() - 1; i >= 0; i--)
{
System.out.println(primes.get(i));
}
Self Check 7.37
What does the array list names contain after the following statements?
ArrayList<String> names = new ArrayList<String>; names.add("Bob");
names.add(0, "Ann");
names.remove(1);
names.add("Cal");

Answer: "Ann", "Cal"


Self Check 7.38
What is wrong with this code snippet?
ArrayList<String> names;
names.add(Bob);

Answer: The names variable has not been initialized.


Self Check 7.39
Consider this method that appends the elements of one array list to another:
public void append(ArrayList<String> target, ArrayList<String> source)
{
for (int i = 0; i < source.size(); i++)
{
target.add(source.get(i));
}
}

What are the contents of names1 and names2 after these statements?
ArrayList<String> names1 = new ArrayList<String>();
names1.add("Emily");
names1.add("Bob");
names1.add("Cindy");
ArrayList<String> names2 = new ArrayList<String>();
names2.add("Dave");
append(names1, names2);

Answer: names1 contains "Emily", "Bob", "Cindy", "Dave"; names2


contains "Dave"
Self Check 7.40
Suppose you want to store the names of the weekdays. Should you use an array list or an array of seven
strings?

Answer: Because the number of weekdays doesn’t change, there is no


disadvantage to using an array, and it is easier to initialize:
String[] weekdayNames = { "Monday", "Tuesday", "Wednesday",
"Thursday", “Friday”, "Saturday", "Sunday" };
Self Check 7.41
The ch07/section_7 directory of your source code contains an alternate implementation of the problem
solution in How To 7.1 on page 330. Compare the array and array list implementations. What is the
primary advantage of the latter?

Answer: Reading inputs into an array list is much easier.


Regression Testing
Test suite: a set of tests for repeated testing
Cycling: bug that is fixed but reappears in later versions
Regression testing: involves repeating previously run tests to ensure that known
failures of prior versions do not appear in new versions
Regression Testing - Two Approaches
Organize a suite of test with multiple tester classes: ScoreTester1,
ScoreTester2, ...
public class ScoreTester1
{
public static void main(String[] args)
{
Student fred = new Student(100);
fred.addScore(10); fred.addScore(20);
fred.addScore(5);
System.out.println("Final score: " + fred.finalScore());
System.out.println("Expected: 30");
}
}

Provide a generic tester, and feed it inputs from multiple files.


section_8/ScoreTester.java
Generic tester:

1 import java.util.Scanner;
2
3 public class ScoreTester
4 {
5 public static void main(String[] args)
6 {
7 Scanner in = new Scanner(System.in);
8 double expected = in.nextDouble();
9 Student fred = new Student(100);
10 while (in.hasNextDouble())
11 {
12 if (!fred.addScore(in.nextDouble()))
13 {
14 System.out.println("Too many scores.");
15 return;
16 }
17 }
18 System.out.println("Final score: " + fred.finalScore());
19 System.out.println("Expected: " + expected);
20 }
21 }
Input and Output Redirection

Section_8/input1.txt
30
10
20
5

Type the following command into a shell window


Input redirection
java ScoreTester < input1.txt

Program Run:
Final score: 30
Expected: 30

Output redirection:
java ScoreTester < input1.txt > output1.txt
Self Check 7.42
Suppose you modified the code for a method. Why do you want to repeat tests that already passed with
the previous version of the code?

Answer: It is possible to introduce errors when modifying code.


Self Check 7.43
Suppose a customer of your program finds an error. What action should you take beyond fixing the error?

Answer: Add a test case to the test suite that verifies that the error is fixed.
Self Check 7.44
Why doesn't the ScoreTester program contain prompts for the inputs?

Answer: There is no human user who would see the prompts because input
is provided from a file.

You might also like