練習問題3.12
やっと分かった。Object型の比較は、Comparable型にキャストしてcompareToを使ってやれば良いって事かな
public abstract class SortHarness { private Object[] values; private final SortMetrics curMetrics = new SortMetrics(); private boolean callSort=false; public final SortMetrics sort(Object[] data){ if(!callSort){ callSort=true; values = data; 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++; Comparable d1 = (Comparable)values[i]; Comparable d2 = (Comparable)values[j]; if(d1.compareTo(d2)==0) return 0; else return (d1.compareTo(d2)<0 ? -1 : 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(); }
public class SimpleSortHarness extends SortHarness{ private boolean call=false; protected void doSort(){ Object tmp[]={0}; if(call) return; else{ call=true; exeSort(); super.sort(tmp); } } private void exeSort(){ for(int i = 0; i < getDataLength(); i++){ for(int j = i + 1; j < getDataLength(); j++){ if(compare(i,j)>0) swap(i,j); } } } }
public class TestSort { static String[] testData = { "AB","BC1.3e-2","E79","03.17" }; public static void main(String args[]){ SortHarness bsort = new SimpleSortHarness(); SortMetrics metrics = bsort.sort(testData); System.out.println("Metrics: " + metrics); for(int i = 0; i < testData.length; i++) System.out.println("\t" + testData[i]); } }
実行結果
Metrics: 0 probes 6 compares 3 swaps
03.17
AB
BC1.3e-2
E79