• No results found

For simplicity we’ve applied the sorting algorithms we’ve looked at thus far to a primitive data type:

double. However, sorting routines will more likely be applied to objects than primitive types. Accordingly, we show a Java program, objectSort.java, that sorts an array of Person objects (last seen in the

classDataArray.java program in Chapter 2).

JAVA CODE FOR SORTING OBJECTS

The algorithm used is the insertion sort from the last section. The Person objects are sorted on lastName; this is the key field. The objectSort.java program is shown in Listing 3.4.

Previous Table of Contents Next

MWSS: Data Structures and Algorithms in Java

by Robert Lafore

Waite Group Press, Macmillan Computer Publishing ISBN: 1571690956 Pub Date: 03/20/98

Previous Table of Contents Next

Listing 3.4 The objectSort.java Program

// objectSort.java

// demonstrates sorting objects (uses insertion sort) // to run this program: C>java ObjectSortApp

//////////////////////////////////////////////////////////////// class Person

{

private String lastName; private String firstName; private int age;

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public Person(String last, String first, int a)

{ // constructor lastName = last; firstName = first; age = a; } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void displayPerson()

{

System.out.print(“ Last name: “ + lastName); System.out.print(“, First name: “ + firstName); System.out.println(“, Age: “ + age);

}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public String getLast() // get last name

{ return lastName; } } // end class Person

//////////////////////////////////////////////////////////////// class ArrayInOb

{

private Person[] a; // ref to array a private int nElems; // number of data items //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public ArrayInOb(int max) // constructor

{

a = new Person[max]; // create the array nElems = 0; // no items yet }

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // put person into array public void insert(String last, String first, int age) {

a[nElems] = new Person(last, first, age);

nElems++; // increment size }

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void display() // displays array contents {

for(int j=0; j<nElems; j++) // for each element, a[j].displayPerson(); // display it

System.out.println(“”); }

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void insertionSort()

{

int in, out;

for(out=1; out<nElems; out++) // out is dividing line {

Person temp = a[out]; // remove marked person in = out; // start shifting at out

while(in>0 && // until smaller one found, a[in−1].getLast().compareTo(temp.getLast())>0) {

a[in] = a[in−1]; // shift item to the right −−in; // go left one position }

a[in] = temp; // insert marked item } // end for

} // end insertionSort()

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− } // end class ArrayInOb

//////////////////////////////////////////////////////////////// class ObjectSortApp

{

public static void main(String[] args) {

int maxSize = 100; // array size

ArrayInOb arr; // reference to array arr = new ArrayInOb(maxSize); // create the array

arr.insert(“Evans”, “Patty”, 24); arr.insert(“Smith”, “Doc”, 59); arr.insert(“Smith”, “Lorraine”, 37); arr.insert(“Smith”, “Paul”, 37); arr.insert(“Yee”, “Tom”, 43); arr.insert(“Hashimoto”, “Sato”, 21); arr.insert(“Stimson”, “Henry”, 29); arr.insert(“Velasquez”, “Jose”, 72); arr.insert(“Vang”, “Minh”, 22); arr.insert(“Creswell”, “Lucinda”, 18); System.out.println(“Before sorting:”);

arr.display(); // display items

arr.insertionSort(); // insertion−sort them

System.out.println(“After sorting:”);

arr.display(); // display them again } // end main()

} // end class ObjectSortApp

Here’s the output of this program:

Before sorting:

Last name: Evans, First name: Patty, Age: 24 Last name: Smith, First name: Doc, Age: 59 Last name: Smith, First name: Lorraine, Age: 37 Last name: Smith, First name: Paul, Age: 37 Last name: Yee, First name: Tom, Age: 43

Last name: Hashimoto, First name: Sato, Age: 21 Last name: Stimson, First name: Henry, Age: 29 Last name: Velasquez, First name: Jose, Age: 72 Last name: Vang, First name: Minh, Age: 22

Last name: Creswell, First name: Lucinda, Age: 18

After sorting:

Last name: Creswell, First name: Lucinda, Age: 18 Last name: Evans, First name: Patty, Age: 24

Last name: Hashimoto, First name: Sato, Age: 21 Last name: Smith, First name: Doc, Age: 59 Last name: Smith, First name: Lorraine, Age: 37 Last name: Smith, First name: Paul, Age: 37 Last name: Stimson, First name: Henry, Age: 29 Last name: Vang, First name: Minh, Age: 22 Last name: Velasquez, First name: Jose, Age: 72 Last name: Yee, First name: Tom, Age: 43

LEXICOGRAPHICAL COMPARISONS

The insertionSort() method is similar to that in insertSort.java, but it has been adapted to compare the lastName key values of records rather than the value of a primitive type.

We use the compareTo() method of the String class to perform the comparisons in the

insertionSort() method. Here’s the expression that uses it:

a[in−1].getLast().compareTo(temp.getLast()) > 0

The compareTo() method returns different integer values depending on the lexicographical (that is, alphabetical) ordering of the String for which it’s invoked and the String passed to it as an argument, as shown in Table 3.1.

TABLE 3.1 OPERATION OF THE compareTo() METHOD s2.compareTo(s1)Return Value

s1 < s2< 0 s1 equals s20 s1 > s2> 0

Previous Table of Contents Next

MWSS: Data Structures and Algorithms in Java

by Robert Lafore

Waite Group Press, Macmillan Computer Publishing ISBN: 1571690956 Pub Date: 03/20/98

Previous Table of Contents Next

For example, if s1 is “cat” and s2 is “dog”, the function will return a number less than 0. In the program this method is used to compare the last name of a[in−1] with the last name of temp.

STABILITY

Sometimes it matters what happens to data items that happen to have equal keys. For example, you may have employee data arranged alphabetically by last names. (That is, the last names were used as key values in the sort.) Now you want to sort the data by zip code, but you want all the items with the same zip code to continue to be sorted by last names. You want the algorithm to sort only what needs to be sorted, and leave everything else in its original order. Some sorting algorithms retain this secondary ordering; they’re said to be stable. All the algorithms in this chapter are stable. For example, notice the output of the objectSort.java

program. There are three persons with the last name of Smith. Initially the order is Doc Smith, Lorraine Smith, and Paul Smith. After the sort, this ordering is preserved, despite the fact that the various Smith objects have been moved to new locations.