【发布时间】:2015-06-03 15:34:53
【问题描述】:
我有一个包含多个变量的对象列表。我想根据运行时决定的顺序对这个列表进行排序。我提出了以下看起来根本没有效率的代码。例如,如果变量不是 3 而是 10 或 30,会发生什么?谁能提出一个更好的方法来做到这一点?
import java.util.List;
import java.util.function.Function;
import static java.util.Comparator.*;
import static java.util.stream.Collectors.*;
public class SortXYZ {
double x;
String y;
double z;
public double getX() {return x; }
public String getY() {return y; }
public double getZ() {return z; }
public static void main(String[] arg) {
Function<SortXYZ, Double> f1 = SortXYZ::getX;
Function<SortXYZ, String> f2 = SortXYZ::getY;
Function<SortXYZ, Double> f3 = SortXYZ::getZ;
//could have f4, f5 etc.
List<SortXYZ> list = getList(); //get a list of SortXYZ objects
String sortSeq = arg[0];
if (sortSeq.equals("XYZ")) {
list = list.stream().sorted(comparing(f1).thenComparing(f2).thenComparing(f3)).collect(toList());
} else if (sortSeq.equals("XZY")) {
list = list.stream().sorted(comparing(f1).thenComparing(f3).thenComparing(f2)).collect(toList());
} else if (sortSeq.equals("YXZ")) {
list = list.stream().sorted(comparing(f2).thenComparing(f1).thenComparing(f3)).collect(toList());
} else if (sortSeq.equals("YZX")) {
list = list.stream().sorted(comparing(f2).thenComparing(f3).thenComparing(f1)).collect(toList());
} else if (sortSeq.equals("ZXY")) {
list = list.stream().sorted(comparing(f3).thenComparing(f1).thenComparing(f2)).collect(toList());
} else if (sortSeq.equals("ZYX")) {
list = list.stream().sorted(comparing(f3).thenComparing(f2).thenComparing(f1)).collect(toList());
}
}
}
【问题讨论】:
标签: java sorting java-8 java-stream