Java - compareTo - Methode um Zähler erweitern

Guten Tag,

im Rahmen einer Informatikübungsaufgabe sollen wir verschiedene Sortieralgorithmen bezüglich ihrer durchgeführten Vergleiche vergleichen.

Dafür sollen wir jedes mal, wenn die Methode compareTo (Integer Objekte) einen Counter erhöhen.
Nun frage ich mich ob es z.B. durch ein Override in der Oberklasse möglich ist den Counter direkt in die CompareTo Methode einzubetten.
So müssten die Counter nicht im Programmtext der Sortieralgorithmen stehen.

Vielen Dank für eure Hilfe.

Benjamin Knauer

Hallo,

Nun frage ich mich ob es z.B. durch ein Override in der
Oberklasse möglich ist den Counter direkt in die CompareTo
Methode einzubetten.
So müssten die Counter nicht im Programmtext der
Sortieralgorithmen stehen.

Die Klasse Integer ist als „final“ deklariert, d.h. von dieser Klasse kann nicht geerbt werden und es können keine Methoden überschrieben werden.

Wenn es aber nicht zwingend ein Integer sein muss: du kannst die Klasse Number implementieren und dir deine eigenes Integer Klasse erstellen:

 private static int compareCount = 0;

 public static void main(String[] args) {

 IntegerNumber theNumberOfTheBeast = new IntegerNumber(666);
 IntegerNumber other = new IntegerNumber(1);
 theNumberOfTheBeast.compareTo(other);

 IntegerNumber[] numbers = {
 new IntegerNumber(4),
 new IntegerNumber(1),
 new IntegerNumber(2),
 new IntegerNumber(3),
 new IntegerNumber(5)
 };

 Arrays.sort(numbers);
 System.out.println("Compare Count: " + compareCount);
 }



 private static class IntegerNumber extends Number implements Comparable {

 private Integer value;

 public IntegerNumber(Integer value) {
 this.value = value; 
 }

 public int compareTo(IntegerNumber other) {
 compareCount++;
 return value.compareTo(other.intValue());
 }

 public String toString() {
 return String.valueOf(value);
 }

 public double doubleValue() {
 return value.doubleValue();
 }

 // weitere zu impelmentierende abtrakte Methoden
 }

HTH
Heavy

N’Abend,

bei Sortierverfahren können Comparatoren übergeben werden, die standardmäßige compareTo(Object) Methode wird dabei ignoriert (das ist sinnvoll, wenn man Objekte nach verschiedenen Kriterien sortieren will). Ich würde empfehelen, einen solchen Komparator zu schreiben, der das Zählen für dich übernimmt:
import java.util.Comparator;

public class CompCounter> implements Comparator {

public int counter = 0;

@Override
public int compare(T o1, T o2) {
counter ++;
return o1.compareTo(o2);
}
}
Das Programm könnte dann so aussehen:
public static void main(String[] args) {
Integer[] array = new Integer[]{3, 2, 7, 1, -1, 8, 3, -7, 9, 4, 0, 3};
analyze(array);
}

public static void analyze(Integer[] values) {
System.out.println("Unsortiert: " + Arrays.asList(values));
CompCounter comparator = new CompCounter();
// Ab Java 1.7 auch ‚CompCounter()‘ (diamond operator)
Arrays.sort(values, comparator);
System.out.println("Sortiert: " + Arrays.asList(values));
System.out.println(comparator.counter + " compareTo()-Aufrufe bei einer Arraygröße von " + values.length);
}

Schöne Grüße, Keks