私はジェネリックスのソートをJavaで実装しようとしています。ここ は、抽象クラスの機能は、(Tソートするために、私の「キー」である)である:Javaでジェネリックのリストをソートするには?
public abstract class Function<T extends Comparable<T>, S> {
abstract public T compute(S o);
}
は、ここでその方法「適用」「計算」の結果に応じてリストをソートクラスプライヤー、されています
はimport java.util.ArrayList;
import java.util.Iterator;
public class Applier<T extends Comparable<T>, S> {
ArrayList<S> apply(ArrayList<S> input, Function<T, S> function) {
ArrayList<T> output = new ArrayList<>();
for(Iterator<S> it = input.iterator(); it.hasNext();){
output.add(function.compute(it.next()));
}
T tmpTi, tmpTj;
S tmpSi, tmpSj;
for(int i=0; i<input.size(); i++) {
for(int j=i+1; j<input.size(); j++) {
if(output.get(i).compareTo(output.get(j))>0) {
tmpTi = output.get(i);
tmpTj = output.get(j);
output.remove(j);
output.remove(i);
output.add(i, tmpTi);
output.add(i, tmpTj);
tmpSi = input.get(i);
tmpSj = input.get(j);
input.remove(j);
input.remove(i);
input.add(i, tmpSj);
input.add(j, tmpSi);
}
}
}
return input;
}
}
私の質問です:このソートを行うよりスマートな方法がありますか、おそらくはバソルトではありませんか?あなたは見当違い、output
にi
とj
ときの要素を再挿入する:あなたはバブルソートの要素を入れ替える方法に誤りがあることを
public static void main(String[] args) {
Applier a = new Applier<>();
StringLength strlen = new StringLength();
ArrayList<String> array = new ArrayList<>();
array.add("Hola");
array.add("Man");
array.add("randomstufff");
array.add("Zerrone");
array.add("Info3a");
System.out.println("Order by length");
System.out.print("before: ");
System.out.println(array);
a.apply(array, strlen); //works on original object
System.out.print("After: ");
System.out.println(array);
は[Collections.sort](https://docs.oracle.com/javase/7/docs/api/java/util/Collectionsです。 html#sort(java.util.List))十分にスマート? Java 8の –
には、 'ArrayList.sort()'があります。http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#sort-java.util.Comparator- –
あなたはJava8を持っています: 'input.sort(Comparator.comparing(el - > function.compute(el)))' –