/* * 練習問題3.12 p.99 * どのようなオブジェクト型もソートできる一般的なSortHarnessクラスを作成しなさい。オブジェクトの順序を比較するのに * <は使用できないとして、オブジェクトの順序を表す方法をどのように提供しますか。 */ package ch03.ex03_12; abstract public class SortHarness { private int SortCount = 0; private Object[] values; private final SortMetrics curMetrics = new SortMetrics(); /** 全ソートをするために呼び出される */ public final SortMetrics sort(Object[] data) { values = data; // -- 改良部分ここから -- if (SortCount > 0) { System.out.println("doSort is used " + SortCount + " times!"); } else { curMetrics.init(); } SortCount++; // -- 改良部分ここまで -- /* * // オリジナル curMetrics.init(); */ doSort(); return getMetrics(); } public final SortMetrics getMetrics() { return curMetrics.clone(); } /** 拡張したクラスが要素の数を知るため */ protected final int getDataLength() { return values.length; } /** 拡張したクラスが要素を調べるため */ protected final Object probe(int i) { curMetrics.probeCnt++; return values[i]; } /** 拡張したクラスが要素を比較するため */ protected final int compare(int i, int j) { curMetrics.compareCnt++; Object d1 = values[i]; Object d2 = values[j]; if (d1 == d2) { return 0; } else { if (d1.toString().compareTo(d2.toString()) == 1) { return 1; } else { return -1; } } } /** 拡張したクラスが要素を交換するため */ protected final void swap(int i, int j) { curMetrics.swapCnt++; Object tmp = values[i]; values[i] = values[j]; values[j] = tmp; } /** 拡張したクラスが実装する -- ソートするのに使用される */ protected abstract void doSort(); }