Introduction to Searching and Sorting

15
1 Introduction to Searching and Sorting Comparable Interface -Reading p. 638-640 Comparator Interface

description

Introduction to Searching and Sorting. Comparable Interface -Reading p. 638-640 Comparator Interface. The Comparable Interface. The Comparable interface is in the java.lang package, and so is automatically available to any program - PowerPoint PPT Presentation

Transcript of Introduction to Searching and Sorting

Page 1: Introduction to Searching and Sorting

1

Introduction to Searching and Sorting

• Comparable Interface -Reading p. 638-640• Comparator Interface

Page 2: Introduction to Searching and Sorting

2

The Comparable Interface

• The Comparable interface is in the java.lang package, and so is automatically available to any program

• It has only the following method heading that must be implemented:public int compareTo(Object other);

• It is the programmer's responsibility to follow the semantics of the Comparable interface when implementing it

Page 3: Introduction to Searching and Sorting

3

The Comparable Interface Semantics

• The method compareTo must return– A negative number if the calling object "comes

before" the parameter other– A zero if the calling object "equals" the

parameter other– A positive number if the calling object "comes

after" the parameter other• If the parameter other is not of the same

type as the class being defined, then a ClassCastException should be thrown

Page 4: Introduction to Searching and Sorting

4

The Comparable Interface Semantics

• Almost any reasonable notion of "comes before" is acceptable– In particular, all of the standard less-than

relations on numbers and lexicographic ordering on strings are suitable

• The relationship "comes after" is just the reverse of "comes before"

Page 5: Introduction to Searching and Sorting

5

The Comparable Interface• The Comparable interface of java.lang

public interface Comparable{

public abstract int compareTo(Object object);

}

• If a class implements Comparable interface, the compareTo method defines the natural ordering of its objects when sorted.

• By repeated calls to compareTo method, The sorting algorithms will be able to sort, according to the natural ordering, a list of objects belonging to a class implementing Comparable interface.

• Several core Java classes implement Comparable interface.

• A user defined class that implements Comparable should implement the compareTo method such that : object1.compareTo(object2) is:

0 if object1 “is equal to” object2

> 0 if object1 “is greater than” object2

< 0 if object1 “is less than” object2

Page 6: Introduction to Searching and Sorting

6

The Comparable Interface (cont’d)• It is also preferable for object1.compareTo(object2) to return 0 if and only if

object1.equals(object2) is true.

• Example 1: A BankAccount defining the natural ordering as the ascending order of accountNumbers.

import java.util.*;  class BankAccount implements Comparable{ private int accountNumber; private String name; private double balance; public int compareTo(Object object){

BankAccount account = (BankAccount) object; if(accountNumber < account.accountNumber) return -1; else if(accountNumber == account.accountNumber) return 0; else return 1;

}

Page 7: Introduction to Searching and Sorting

7

The Comparable Interface (cont’d) public String toString(){ return "Account#: " + accountNumber + " , Name: " + name + " , Balance: " + balance + " SR"; }}

Assuming that account1 and account2 are BankAccount objects, a typical call to the compareTo method is:

1. int comparisonResult = account1.compareTo(account2);

2. if(comparisonResult == 0)

3. System.out.println(“Same account”);

4. else if (comparisonResult < 0)

5. System.out.println(“acountNumber1 is smaller”);

6. else

7. System.out.println(“accountNumber2 is smaller”);

Page 8: Introduction to Searching and Sorting

8

The Comparator Interface• If we want to sort  objects of a class which does not implement Comparable interface, or the

class implements Comparable but we want To order its objects in a way different from the natural ordering defined by Comparable, the java.util.Comparator interface should be used.

• The Comparator interface is one of the java collections framework interfaces.

• The Java collection framework is a set of important utility classes and interfaces in the java.util package for working with collections.

• A collection is a group of objects.

• Comparator interface defines how collection objects are compared.public interface Comparator{

public abstract int compare(Object object1, Object object2);public abstract boolean equals(Object object);

}A class that implements Comparator should implement the compare method such that its returned

value is: 0 if object1 “is equal to” object2> 0 if object1 “is greater than” object2< 0 if object1 “is less than” object2

Page 9: Introduction to Searching and Sorting

9

The Comparator Interface (cont’d)• It is also preferable for the compare method to return 0 if and only if

object1.equals(object2) is true.

• The compare method throws a ClassCastException if the type of object1 and that of object2 are not compatible for comparison.

• The equals method concerns the Comparator object. It returns true if its parameter is a Comparator object and if it uses the same ordering as the invoking (calling) Comparator object; otherwise it returns false.

• Note: Since each class inherits the equals method from the Object class, it is not necessary for a class that implements the Comparator interface to implement the equals method to be a concrete class.

• In our examples concerning the Comparator interface, the equals method will not be implemented.

Page 10: Introduction to Searching and Sorting

10

The Comparator Interface (cont’d)• Example 2: This example sorts the strings in reverse order of the alphabetical one.

import java.util.*; class StringReverseComparator implements Comparator{ public int compare(Object object1, Object object2){ String string1 = object1.toString(); String string2 = object2.toString(); // Reverse the comparison return string2.compareTo(string1); } }class Test { public static void main(String[] args) { string[] array={"Ahmad","Mohammad","Ali","Hisham","Omar","Bilal","Hassan"}; Arrays.sort(array,new StringReverseComparator());

System.out.println(Arrays.asList(array));}}-The sort method ,in the Arrays class, sorts the array “array” according to the

comparator object. Notice the comparator object is provided as a parameter for the sorting method; it is an object from the class StringReverseComparator .

- After printing, we get the following order:[Omar, Mohammad, Hisham, Hassan, Bilal, Ali, Ahmad]

Page 11: Introduction to Searching and Sorting

11

The Comparator Interface (cont’d)Example 3: Here the order of the comparator is the descending order of the

absolute valuesimport java.util.*; class MyComparator implements Comparator { public int compare(Object obj1, Object obj2) { int i1 = ((Integer)obj1).intValue(); int i2 = ((Integer)obj2).intValue(); return Math.abs(i2) - Math.abs(i1); }} class TestCollections2 { public static void main(String args[]) { Integer[] array = {new Integer(-200),new Integer(100), new Integer(400),new Integer(-300)}; Arrays.sort(array); System.out.println("Natural ordering: " + Arrays.asList(array)); Arrays.sort(array, new MyComparator()); // sorting acording to MyComparator System.out.println("My own ordering : " + Arrays.asList(array)); } }

Page 12: Introduction to Searching and Sorting

12

The Comparator Interface (cont’d)

Example 4: Here we want to order the BankAccount objects, not according to their natural ordering as defined before, but according to the opposite of the alphabetical order of the names of their owners.

2 class MyComparator implements Comparator{3 public int compare(Object object1, Object object2){4 BankAccount account1 = (BankAccount) object1;5 BankAccount account2 = (BankAccount)object2;6 String string1 = account1.getName();7 String string2 = account2.getName();8 // Reverse the comparison9 return string2.compareTo(string1);10 }11 }

Page 13: Introduction to Searching and Sorting

13

-Example 5: Consider the following Student classclass Student {private String name;private int id;public Student( String newName, int id ) {name = newName;this.id = id;}public String getName(){ return name; }public int getId(){ return id;}public String toString() { return name + ":" + id; }}Consider the following class the implements Comparatorclass StudentNameComparator implements Comparator {public int compare( Object leftOb, Object rightOb ) {String leftName = ((Student) leftOb).getName();String rightName = ((Student) rightOb).getName();return leftName.compareTo( rightName );}}In order to sort students alphabetically by their names, we need to call a Arrays.sort method with 2 parameters; an array of students and an object from StudentNameComparator class

Page 14: Introduction to Searching and Sorting

14

Example 5 (continued)Consider now the following classclass StudentIdComparator implements Comparator {public int compare( Object b1, Object b2 ) {long leftId = ((Student) b1).getId();long rightId = ((Student) b2).getId();if ( leftId < rightId )return -1;else if ( leftId > rightId )return 1;elsereturn 0;// the above if construct can be replaced by a single statement// return leftId-rightId; }}In order to sort students by ascending orderof their id numbers, we need to call a Arrays.sort method with 2 parameters; an array of students and an object from StudentNameComparator class

Page 15: Introduction to Searching and Sorting

15

Example 5 (continued)The following is a test class to see how sorting works for an arrayof student objects. It is done either alphabetically, or by id. import java.util.*;class Test {public static void main(String args[]) {Student[] sts = { new Student( "Ahmad", 520 ), new Student( "Rashed", 210 ),new Student( "Bandar", 101 ),new Student("Hatem",992) };//Sort the array alphabeticallyArrays.sort( sts, new StudentNameComparator() );System.out.println("Students sorted alphabetically");for ( int k = 0; k < sts.length; k++ )System.out.println( sts[k]);//Sort the array by ascending id numbersArrays.sort( sts, new StudentIdComparator() );System.out.println("Students sorted by id numbers");for ( int k = 0; k < sts.length; k++ )System.out.println( sts[k]);}}