© 1999-2007, Flemming Koch Jensen
Alle rettigheder forbeholdt
Søgning/sortering i Java

Vejledende løsninger

 

 

1
Main.java
i
0

 

2.1
Heltal.java
public class Heltal implements Comparable {
  private int tal;
  
  public Heltal( int tal ) {
    this.tal = tal;
  }
  
  public int compareTo( Object obj ) {
    if ( obj instanceof Heltal ) {
      Heltal other = (Heltal) obj;
      
      if ( tal < other.tal )
        return -1;
      else if ( tal > other.tal )
        return 1;
      else
        return 0;
      
    } else
      return -1;
  }
  
  public String toString() {
    return "" + tal;
  }
}
Bemærk at compareTo-metoden anvender operatoren: instanceof, til at skelne instanser af Heltal fra andre objekter.
Main.java
import java.util.*;

public class Main {

  public static void main( String[] argv ) {
    int[] tal = { 5, 8, 3, 6, 2, 9, 7, 1, 0, 2 };

    Heltal[] array = new Heltal[ tal.length ];
    
    for ( int i=0; i<tal.length; i++ )
      array[i] = new Heltal( tal[i] );
    
    Arrays.sort( array );
    
    for ( int i=0; i<array.length; i++ )
      System.out.print( array[i] + " " );
    System.out.println();
    
    int findes = Arrays.binarySearch( array, new Heltal( 3 ) );
    System.out.println( findes );
    
    int ikke = Arrays.binarySearch( array, new Heltal( 4 ) );
    System.out.println( ikke );
  }
}
0 1 2 2 3 5 6 7 8 9
4
-6
2.2
VorComparator.java
import java.util.*;

public class VorComparator implements Comparator {
  
  public int compare( Object obj1, Object obj2 ) {
  
    if ( obj1 instanceof Heltal && obj2 instanceof Heltal )
      return ((Heltal) obj1).compareTo( obj2 );
      
    else if ( obj1 instanceof String && obj2 instanceof String )
      return ((String) obj1).compareTo( obj2 );
    
    else if ( obj1 instanceof String && obj2 instanceof Heltal )
      return 1;

    else
      return -1;
  }
}
Her deler if-sætningerne i de tre situationer, der er beskrevet i opgaven. Det bemærkes, at den afsluttende else ikke alene håndterer, at en eller flere af objekterne ikke er en instans af Heltal/String, men også tager sig af den situation; hvor første parameter er et Heltal og anden parameter er en String.
Det bemærkes ligeledes, at vi ikke behøver tilgå datakernen i hverken Heltal eller String, idet vi udnytter, at begge klasser implementerer Comparable-interfacet.
Endelig har vi en testanvendelse:
Main.java
import java.util.*;

public class Main {

  public static void main( String[] argv ) {
    int[] tal = { 5, 8, 3, 6, 2 };
    String[] text = { "Ikast", "Silkeborg", "Herning", "Viborg", "Holstebro" };

    Object[] array = new Object[ tal.length + text.length ];
    
    int pos=0;

    for ( int i=0; i<text.length; i++ )
      array[pos++] = text[i];
    
    for ( int i=0; i<tal.length; i++ )
      array[pos++] = new Heltal( tal[i] );
    
    Arrays.sort( array, new VorComparator() );
    
    for ( int i=0; i<array.length; i++ )
      System.out.print( array[i] + " " );
    System.out.println();
  }
}
2 3 5 6 8 Herning Holstebro Ikast Silkeborg Viborg
Bemærk, at vi som udgangspunkt placerer tekststrengene først i array'et, for at udfordre VorComparator's evne til at håndtere ordningen mellem Heltal og String's.