12.07.2015 Views

A Practical Introduction to Data Structures and Algorithm Analysis

A Practical Introduction to Data Structures and Algorithm Analysis

A Practical Introduction to Data Structures and Algorithm Analysis

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

146 Chap. 4 Lists, Stacks, <strong>and</strong> Queues}public int size() // Return list size{ return list.length(); }Figure 4.31 (continued)find the record prior <strong>to</strong> removal, we would still need <strong>to</strong> shift down the remainingrecords in the list <strong>to</strong> fill the gap left by the remove operation.Given two keys, we have not properly addressed the issue of how <strong>to</strong> comparethem. One possibility would be <strong>to</strong> simply use the basic ==, = opera<strong>to</strong>rsbuilt in<strong>to</strong> Java. This is the approach taken by our implementations for dictionariesshown in Figure 4.31. If the key type is int, for example, this will workfine. However, if the key is a pointer <strong>to</strong> a string or any other type of object, thenthis will not give the desired result. When we compare two strings we probablywant <strong>to</strong> know which comes first in alphabetical order, but what we will get fromthe st<strong>and</strong>ard comparison opera<strong>to</strong>rs is simply which object appears first in memory.Unfortunately, the code will compile fine, but the answers probably will not be fine.In a language like C++ that supports opera<strong>to</strong>r overloading, we could requirethat the user of the dictionary overload the ==, = opera<strong>to</strong>rs for the givenkey type. This requirement then becomes an obligation on the user of the dictionaryclass. Unfortunately, this obligation is hidden within the code of the dictionary (<strong>and</strong>possibly in the user’s manual) rather than exposed in the dictionary’s interface. Asa result, some users of the dictionary might neglect <strong>to</strong> implement the overloading,with unexpected results. Again, the compiler will not catch this problem.The Java Comparable interface provides an approach <strong>to</strong> solving this problem.In a key-value pair implementation, the keys can be required <strong>to</strong> implementthe Comparable interface. In other applications, the records might be required<strong>to</strong> implement ComparableThe most general solution is <strong>to</strong> have users supply their own definition for comparingkeys. The concept of a class that does comparison (called a compara<strong>to</strong>r)is quite important. By making these operations be generic parameters, the requirement<strong>to</strong> supply the compara<strong>to</strong>r class becomes part of the interface. This design isan example of the Strategy design pattern, because the “strategies” for comparing<strong>and</strong> getting keys from records are provided by the client. In many cases, it is alsopossible for the compara<strong>to</strong>r class <strong>to</strong> also extract the key from the record type, as analternative <strong>to</strong> s<strong>to</strong>ring key-value pairs.We will use the Comparable interface in Section 5.5 <strong>to</strong> implement comparisonin heaps, <strong>and</strong> in Chapter 7 <strong>to</strong> implement comparison in sorting algorithms.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!