Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Lecture 6 Objects for Organizing Data Instructors: Fu-Chiung Cheng (鄭福炯) Associate Professor Computer Science & Engineering Tatung Institute of Technology 1 Outline • • • • • array declaration and use arrays of objects parameters and arrays multidimensional arrays the Vector class • additional techniques for managing strings 1 Arrays • • • • An array is an ordered list of values Each value has a numeric index An array of size N is indexed from zero to N-1 The following array of integers has a size of 10 and is indexed from 0 to 9 0 scores 1 2 3 4 5 6 7 8 9 79 87 94 82 67 98 87 81 74 91 2 Arrays • Array reference: scores[4] – the 5th value in the array – refers to the value 67 • It can be assigned a value, printed, used in a calculation 3 Arrays • An array stores multiple values of the same type • That type can be primitive types or objects • We can create an array of integers, or an array of characters, or an array of String objects, etc. • Array is an object • The name of the array is a object reference variable, and the array itself is instantiated separately 4 Declaring Arrays • The scores array could be declared as follows: int[] scores = new int[10]; – Type: int[] (an array of integers) – Size: 10 (array of 10 integers) • Unknown size: a handle to an array object int[] scores; 5 Declaring Arrays • Some examples of array declarations: float[] prices = new float[500]; boolean[] flags; flags = new boolean[20]; char[] codes = new char[1750]; 6 Bounds Checking • Once an array is created, it has a fixed size • An index used in an array reference must specify a valid element • That is, they must be in bounds (0 to N-1) • The Java interpreter will throw an exception if an array index is out of bounds • This is called automatic bounds checking • Its common to inadvertently introduce off-by-one errors when using arrays 7 Bounds Checking • Each array object has a public constant called length that stores the size of the array • It is referenced through the array name (just like any other object): scores.length • Note that length holds the number of elements, not the largest index • See Reverse_Numbers.java and Adjust_Test_Scores.java 8 Array Declarations Revisited • Array declarations: two ways float[] prices; and float prices[]; are essentially equivalent • The first format is usually more readable 9 Initializer Lists • An initializer list can be used to instantiate and initialize an array in one step • The values are delimited by braces and separated by commas • Examples: char[] letterGrades = {'A', 'B', 'C', 'D', 'F'}; int[] primes = {2, 3, 5, 7, 11, 13, 17, 19}; 10 Initializer Lists • Note that when an initializer list is used: – the new operator is not used – no size value is specified • The size of the array is determined by the number of items in the initializer list • An initializer list can only be used in the declaration of an array 11 Arrays of Objects • The elements of an array can be object references • The declaration String[] words = new String[25]; reserves space to store 25 references to String objects • It does NOT create the String objects themselves • Each object stored in an array must be instantiated separately 12 Arrays of Objects • Objects can have arrays as instance variables • Fairly complex structures can be created simply with arrays and objects • See RollCall.java (next 4 pages) 13 class RollCall { public static void main (String[] args) { Membership roster = new Membership(); Member person; System.out.println(); person = roster.findMember(26911); if (person == null) System.out.println ("No match found"); else { System.out.println (”Found the following member:"); person.print(); } System.out.println(); roster.print(); } // method main } // class RollCall class Membership { private Member[] memberList; public Membership() { memberList = new Member[4]; memberList[0] = new Member ("Johnny Storm", 70469); memberList[1] = new Member ("Sue Richards", 69048); memberList[2] = new Member ("Reed Richards", 26911); memberList[3] = new Member ("Ben Grimm", 89696); } // constructor Membership public Member findMember (int target) { int index = 0; while (index < memberList.length) { if (memberList[index].getMembershipNumber() == target) return memberList[index]; index++; } return null; } public Member findMember (int target) { int index = 0; while (index < memberList.length) { if (memberList[index].getMembershipNumber() == target) return memberList[index]; index++; } return null; } // method findMember public void print() { System.out.println ("Member\t\tId #"); for (int person=0; person < memberList.length; person++) memberList[person].print(); } // method print } // class Membership class Member { private String name; private int membershipNumber; public Member (String memberName, int idNumber) { name = memberName; membershipNumber = idNumber; } // constructor Member public int getMembershipNumber() { return membershipNumber; } // method getMembershipNumber public void print() { System.out.println (name + "\t" + membershipNumber); } // method print } // class Member Arrays as Parameters • An entire array can be passed to a method as a parameter • The reference to the array is passed, making the formal and actual parameters aliases of each other • Changing an array element in the method changes the original • An array element can be passed to a method as well, and follow the parameter passing rules of that element's type 14 • See Array_Test.java Multidimensional Arrays • A one-dimensional array stores a simple list of values • A two-dimensional array can be thought of as a table of values, with rows and columns • A two-dimensional array element is referenced using two index values • A two-dimensional array in Java is an array of arrays, therefore each row can have a different length 15 Multidimensional Arrays • An initializer list can be used to create and set up a multidimensional array • Note that each array dimension has its own length constant • See MultiArrayTest.java (Next page) • See Class MultiArray 16 class MultiArrayTest { public static void main (String[] args) { MultiArray chart = new MultiArray(); chart.print(); System.out.println(); for (int column=0; column < 4; column++) System.out.println ("Sum of column " + column + ": " + chart.sumColumn (column)); } // method main } // class MultiArrayTest class MultiArray { int[][] table = { {28, 84, 47, 72}, {69, 26}, {91, 40, 28}, {42, 34, 37}, {13, 26, 57, 35} }; public void print() { for (int row=0; row < table.length; row++) { for (int column=0; column < table[row].length; column++) System.out.print (table[row][column] + " "); System.out.println(); } } // method print public int sumColumn (int column) { int sum = 0; for (int row=0; row < table.length; row++) if (column < table[row].length) sum += table[row][column]; return sum; } // method sumColumn } // class MultiArray class Soda_Scores { private final int RESPONDENTS = 10; private final int SODAS = 4; private int[][] results = { {3, 4, 5, 2, 1, 4, 3, 2, 4, 4}, {2, 4, 3, 4, 3, 3, 2, 1, 2, 2}, {3, 5, 4, 5, 5, 3, 2, 5, 5, 5}, {1, 1, 1, 3, 1, 2, 1, 3, 2, 4} }; public int num_sodas() { return SODAS; } public boolean worthy (int soda, int level) { int count = 0; for (int person=0; person < results[soda].length; person++) if (results[soda][person] >= level) count++; return (count > RESPONDENTS/2); } // method worthy } // class Soda_Scores What is wrong with this class? The Vector Class • An object of class Vector is similar to an array in that it stores multiple values • However, a vector – only stores objects – does not have the indexing syntax that arrays have • Service methods are used to interact with a vector • The Vector class is part of the java.util package • See Beatles.java (next page) import java.util.Vector; class Beatles { public static void main (String[] args) { Vector band = new Vector(); band.addElement ("Paul"); band.addElement ("Pete"); band.addElement ("John"); band.addElement ("George"); System.out.println (band); band.removeElement ("Pete"); band.addElement ("Ringo"); System.out.println (band); } // method main } // class Beatles The Vector Class • An important difference between an array and a vector is that a vector can change its size as needed. • Each vector initially has a certain amount of memory space reserved for storing elements • If an element is added that doesn't fit in the existing space, more room is automatically acquired The Vector Class • A vector is implemented using an array • Whenever new space is required, a new, larger array is created, and the values are copied from the original to the new array • To insert an element, existing elements are first copied, one by one, to another position in the array • Therefore, the implementation of Vector in the API is not very efficient • See ZZ_Top.java (Next) 19 import java.util.Vector; // page 825 class ZZ_Top { public static void main (String[] args) { Vector song = new Vector(); String name = new String ("ZZ Top's Greatest Hits"); Integer track = new Integer (6); String title = "Cheap Sunglasses"; Double price = new Double (15.95); Vector authors = new Vector (2); authors.addElement ("Gibbons"); authors.addElement ("Hill"); song.addElement (track); song.addElement (title); song.addElement (authors); song.addElement (price); song.insertElementAt (name, 0); System.out.println (song); authors.addElement ("George"); System.out.println (song); System.out.println ("song size: " + song.size()); System.out.println ("authors size: " + authors.size()); System.out.println ("song begins: " + song.firstElement()); System.out.println ("authors begins: " + authors.firstElement()); System.out.println ("song ends: " + song.lastElement()); System.out.println ("authors ends: " + authors.lastElement()); authors.setElementAt ("Frank", authors.indexOf ("George")); System.out.println (song); song.removeAllElements(); System.out.println (song); } // method main } // class ZZ_Top The StringTokenizer Class Revisited • We've seen a StringTokenizer object separate a string into separate tokens • By default, those tokens are delimited by white space • By using other StringTokenizer constructors, we can define the delimiters used to define a token • We can also set whether we want the delimiters themselves returned as tokens • See Voltaire.java and URL_Tokens.java import java.util.StringTokenizer; // page 805 public class Voltaire { public static void main (String[] args) { String quote = "Use, do not abuse; neither abstinence " + "nor excess renders a man happy."; StringTokenizer words = new StringTokenizer (quote); System.out.println ("Characters: " + quote.length()); System.out.println ("Tokens: " + words.countTokens()); while (words.hasMoreTokens()) { System.out.println (words.nextToken()); } } // method main } // class Voltaire class URL_Tokenizer { private String protocol; private String address; private String resource; public URL_Tokenizer (String URL_Text) { StringTokenizer URL = new StringTokenizer (URL_Text, ":"); protocol = URL.nextToken(); address = URL.nextToken (":/"); resource = URL.nextToken (""); } // constructor URL_Tokenizer public String get_protocol() { return protocol; } public String get_address() { return address; } public String get_resource() { return resource; } } // class URL_Tokenizer … URL_Tokenizer url = new URL_Tokenizer ("http://www.wpllabs.com/vision.html"); // main The StringBuffer Class • Recall that the value of a String object is immutable; once set it cannot be changed • The StringBuffer class can be used to define a character string whose value can change • It's service methods include the ability to append and insert characters • See Money.java • However, most functionality defined by the StringBuffer class can be accomplished with String objects and string concatenation public class Money { public static void main (String[] args) { StringBuffer text1 = new StringBuffer(); // page 803 StringBuffer text2 = new StringBuffer(" m"); StringBuffer text3 = new StringBuffer ("1 dollar"); text1.append (1); text1.append (" p"); text1.append ('e'); text1.append ('n'); text1.append ("ny"); text2.insert (0, 1); text2.insert (2, "di"); System.out.println (text1); System.out.println (text2); System.out.println (text3); text3.reverse(); System.out.println (text3); } // method main} // class Money text2.insert (5, 'e'); Conclusion • Java Array is an object. • Array size of N: index 0 to N-1 • Bounds checking • Mutlidimensional array ==> array of arrays each element could have a different length. • Vector (similar to Array) can dynamically change size • StringTokenizer class (good for compiler and other app. • StringBuffer class