Transcript PPT

ISE 582: Information Technology
for Industrial Engineering
Instructor: Elaine Chew
University of Southern California
Department of Industrial and Systems Engineering
Lecture 6
JAVA Cup Five: Data Structures
Winston & Narasimhan: Chapt 27-31, 33
JAVA Cup 5
• File Access
– Input file streams
– Output file streams
• Arrays and Vectors
– How to create and access arrays
– Expandable vectors
• Characters and Strings
2 October 2003
Web Technology for IE
2
File Input Streams
•
•
•
•
•
Reading files one-byte-at-a-time
Taking bigger bites
Java’s input-output package
Traditional string handling
Updating to tokens: number / words
2 October 2003
Web Technology for IE
3
File input streams
• A stream is a sequence of values.
• To read bytes from a file:
– FileInputStream stream = new
FileInputStream(“input.data”)
– FileInputStream stream = new
FileInputStream(“~username/public_html/ise582/input.dat
a”);
• When you are done, it is good to:
– stream.close()
• Reads ONE BYTE AT A TIME…
2 October 2003
Web Technology for IE
4
To take bigger bites than bytes
• To read characters from your file:
– InputStreamReader reader = new InputStreamReader(stream);
• To read lines from your file:
– BufferedReader buffer = new BufferedReader(reader);
– buffer.readLine()
stream
2 October 2003
reader
Web Technology for IE
buffer
5
Input-output package
• Notify JAVA that you want to work with
input or output streams:
– import java.io.FileInputStream
– import java.io.*
• In the event of error
– use try-catch statements
– throw an exception, throws IOException
2 October 2003
Web Technology for IE
6
Traditional Approach Example
import java.io.*;
public class Demonstrate {
public static void main(String argv[]) throws IOException {
FileInputStream stream = new FileInputStream(“input.data”);
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buffer = new BufferedReader(reader);
String line;
while ((line=buffer.readLine())!=null && !line.equals(“”)) {
System.out.println(“Line read: “ + line); }
stream.close();
return;
}}
2 October 2003
Web Technology for IE
7
String Methods
• line.trim()
– removes white space
• line.indexOf(“ “)
– index of first occurrence, starts from 0
• line.substring(2)
– returns rest of line after index 2
• line.substring(0,1)
• Integer.parseInt(“4”)
– converts string to integer
2 October 2003
Web Technology for IE
8
Example Continued
line = line.trim();
int nextSpace = line.indexOf(" ");
int x = Integer.parseInt(line.substring(0,nextSpace));
line = line.substring(nextSpace).trim();
nextSpace=line.indexOf(" ");
int y = Integer.parseInt(line.substring(0,nextSpace));
line = line.substring(nextSpace).trim();
int z = Integer.parseInt(line);
System.out.println("Numbers read: " + x + ", " + y + ", " + z);
2 October 2003
Web Technology for IE
9
The Token Approach
• The stream tokenizer:
– StreamTokenizer tokens = new StreamTokenizer(reader);
– Do away with the BufferedReader
– Divides character sequences into tokens, delimited by
white space
• Token Methods:
–
–
–
–
tokens.nextToken()
assigns value to nval, tokens.nval
always a double, if need recasting: (int) tokens.nval
end of token string indicated by TT_EOF: tokens.TT_EOF
2 October 2003
Web Technology for IE
10
Token Example
import java.io.*;
public class Demonstrate {
public static void main (String argv[]) throws IOException {
FileInputStream stream = new FileInputStream("input.data");
InputStreamReader reader = new InputStreamReader(stream);
StreamTokenizer tokens = new StreamTokenizer(reader);
while (tokens.nextToken()!= tokens.TT_EOF) {
int x = (int) tokens.nval;
tokens.nextToken(); int y = (int) tokens.nval;
tokens.nextToken(); int z = (int) tokens.nval;
Movie m = new Movie(x,y,z);
System.out.println("Rating: " + m.rating()); }
stream.close(); }}
2 October 2003
Web Technology for IE
11
Words vs. Numbers
• If the token is a number
– nextToken returns a TT_NUMBER instance
– the number is assigned to nval
• If the token is a word
– nextToken returns a TT_WORD instance
– the number is assigned to sval
2 October 2003
Web Technology for IE
12
Word / Number Example
int next=0;
while ((next=tokens.nextToken())!= tokens.TT_EOF) {
switch (next) {
case tokens.TT_WORD: break;
case tokens.TT_NUMBER:
int x = (int) tokens.nval;
tokens.nextToken(); int y = (int) tokens.nval;
tokens.nextToken(); int z = (int) tokens.nval;
Movie m = new Movie(x,y,z);
System.out.println("Rating: " + m.rating());
break; }
}
2 October 2003
Web Technology for IE
13
Arrays and Vectors
•
•
•
•
•
•
•
Creating / assigning values to arrays
Passing arrays to methods
Command-line arguments
Creating vectors
Vector methods
Vectors as targets
Using vector iterators
2 October 2003
Web Technology for IE
14
Creating Arrays
• Creating an array
– <elt_type> <array_name> [] = new <elt_type> [ <size> ];
– int durations [] = new int [4];
• What you can do with an array
– call / assign an elt: <array_name> [<index>]
– find its length: <array_name>.length
• Arrays of class instances
– <Class> <array_name> [] = new <Class> [ <size> ];
– Movie movies [] = new Movie [4];
2 October 2003
Web Technology for IE
15
Instance Array Elements
• Field-selection operator still works
– movies[3].script = 6
• Checking to see if element is assigned
– movies[2] == null
• Using instance as target for method
– movies[1].rating()
2 October 2003
Web Technology for IE
16
Mixing Creation and Elt Insertion
public class Demonstrate {
public static void main (String argv[]) {
Movie movies[] = { new Movie(5,6,3),
new Movie(8,7,7),
new Movie(7,2,2),
new Movie(7,5,5)};
int sum = 0;
for (int counter=0; counter < movies.length; ++counter) {
sum += movies[counter].rating();
}
System.out.print("The average rating of the " + movies.length);
System.out.println(" movies is " + sum / movies.length);
}}
2 October 2003
Web Technology for IE
17
Arrays and Memory
• Arrays are reference type variables
• Integer arrays contain a length
variable and 4 bytes of memory per
instance
• Class instance arrays contain a length
variable and several bytes for the
address of each instance
2 October 2003
Web Technology for IE
18
Higher Dimension Arrays
• You can easily define
arrays of higher
dimension
– double 2DArray [] [] = new
double[2][100];
2 October 2003
Web Technology for IE
19
Passing an Array to a Method
• To designate that a parameter is array
– public static Movie[] readData(Movie movies []) throws
IOExc..
– public static Movie[] readData(Movie[] movies) throws
IOExc..
• E.g.: put file-reads into Auxiliary Class
• Some ways to define readData:
– Create array, pass array address to method, return address
– Create array, pass array address to method, return nothing
– Create array variable, pass filename to method, return array
2 October 2003
Web Technology for IE
20
Command-Line Arguments
• The main methods has one parameter
– an array of Strings, argv[]
– argv.length is # command-line arguments
2 October 2003
Web Technology for IE
21
Example
public class Command {
public static void main(String argv[]) {
Movie m = new Movie(Integer.parseInt(argv[0]),
Integer.parseInt(argv[1]),
Integer.parseInt(argv[2]));
System.out.println("The rating is " + m.rating());
}
}
2 October 2003
Web Technology for IE
22
Vectors
• Vectors vs. Arrays
– variable in length
– insertions can occur at any point
– elements can only be class instances
• Provided by Java’s utility package
– import java.util.*
– Vector v = new Vector();
2 October 2003
Web Technology for IE
23
Vector Methods
• Insertions and deletions
–
–
–
–
v.addElement(m) … adds to back end of vector
v.insertElementAt(m,0) … adds to front of vector
v.removeElementAt(0) … removes first element
v.setElementAt(m,4) … replaces element
• Access to elements
– v.firstElement()
– v.lastElement()
– v.elementAt(2)
2 October 2003
• Size of Vector
– v.size()
Web Technology for IE
24
A Little Quiz
• Which methods do you need to
represent FIFO queues?
• Which methods do you need to
represent LIFO queues (stacks)?
2 October 2003
Web Technology for IE
25
Vectors as Targets
• All vector elements are
instances of the Object class
• All vector methods work with
instances of the Object class
• You can work with an element
of the vector class by casting
the element:
– ( (Movie) (v.firstElement()) ).rating()
2 October 2003
Web Technology for IE
26
Example
import java.io.*;
import java.util.*;
public class Auxiliaries2 {
public static Vector readData(String fileName) throws IOException {
FileInputStream stream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(stream);
StreamTokenizer tokens = new StreamTokenizer(reader);
Vector v = new Vector();
while (tokens.nextToken() != tokens.TT_EOF) {
int x = (int) tokens.nval;
tokens.nextToken(); int y = (int) tokens.nval;
tokens.nextToken(); int z = (int) tokens.nval;
v.addElement(new Movie(x,y,z)); }
stream.close();
return v; }}
2 October 2003
Web Technology for IE
27
Iterators
• An iterator maintains a pointer to a place on
the parent vector
• To create an iterator
– Iterator i = v.iterator()
• Some Iterator methods
– i.next() … returns element, advances pointer
– i.hasNext()
2 October 2003
Web Technology for IE
28
Example
import java.io.*;
import java.util.*;
public class Demonstrate {
public static void main(String argv[]) throws IOException {
Vector mainVector = Auxiliaries2.readData("input.data");
int size = mainVector.size();
for ( Iterator i = mainVector.iterator(); i.hasNext(); ) {
System.out.println(( (Movie) i.next() ).rating());
}
}
}
2 October 2003
Web Technology for IE
29
Working with Char & Strings
• What you can do with Strings
• Specifying delimiters in File-reads
2 October 2003
Web Technology for IE
30
The String s
•
•
•
•
•
•
•
s.length() … compare this to arrays
+ concatenates two strings
s.charAt(0) extracts first character
s.charAt(0)==‘M’ … note single quotes
switch(s) … use in switch statements
char c = s.charAt(0);
default character is ‘\u000’
2 October 2003
Web Technology for IE
31
Example (excerpt)
while (tokens.nextToken() != tokens.TT_EOF) {
String codeString = tokens.sval;
tokens.nextToken(); int x = (int) tokens.nval;
tokens.nextToken(); int y = (int) tokens.nval;
tokens.nextToken(); int z = (int) tokens.nval;
switch (codeString.charAt(0)) {
case 'M': v.addElement(new Movie(x,y,z)); break;
case 'S': v.addElement(new Symphony(x,y,z)); break;
}
}
2 October 2003
Web Technology for IE
32
Specifying Delimiters
• To advise the tokens tokenizer to use
double quotation marks to delimit
strings:
– tokens.quoteChar((int) ‘”’)
• To tell the tokenizer to recognize
carriage returns:
– tokens.eolIsSignificant(true);
2 October 2003
Web Technology for IE
33
Example (excerpt)
tokens.quoteChar((int) '"');
tokens.eolIsSignificant(true);
Vector v = new Vector();
while (tokens.nextToken() != tokens.TT_EOF) {
String nameString = tokens.sval;
tokens.nextToken(); int x = (int) tokens.nval;
tokens.nextToken(); int y = (int) tokens.nval;
tokens.nextToken(); int z = (int) tokens.nval;
Movie m = new Movie(x,y,z);
m.title = nameString;
if (tokens.nextToken() == tokens.TT_EOL) {}
else { m.poster = tokens.sval; tokens.nextToken(); }
v.addElement(m); }
2 October 2003
Web Technology for IE
34
Working with O/p File Streams
• To connect to output file
– FileOutputStream stream = new
FileOutputStream(“output.data”);
• To write more than 1-byte-at-a-time
– PrintWriter writer = new PrintWriter(stream);
• It’s good to flush out buffered characters
– writer.flush()
• Close the file
– stream.close()
2 October 2003
Web Technology for IE
35
Example (part)
import java.io.*; import java.util.*;
public class Demonstrate {
public static void main(String argv[]) throws IOException {
FileOutputStream stream = new FileOutputStream("output.data");
PrintWriter writer = new PrintWriter(stream);
Vector mainVector = Auxiliaries4.readData("input3.data");
int size = mainVector.size();
for (Iterator i = mainVector.iterator(); i.hasNext();) {
Movie m = (Movie) i.next();
m.writeToFile(writer);
writer.println(m.rating()); }
writer.flush();
stream.close();
System.out.println("File written"); }}
2 October 2003
Web Technology for IE
36