我有一个对象矢量。
class companyInfo {
String name;
int stat1;
int stat2;
double stat3;
double stat4;
double stat5;
}
我知道如何通过使用其中一个属性实现Comparator来对矢量进行排序,但我需要能够动态排序。例如
public function() {
for(int i = 0; i < number of different stats; i++) {
//sort by stat(i);
//do some analysis
}
}
这样我就可以按指定的stat对矢量进行排序,对矢量进行一些分析。然后按另一个统计数据排序,做同样的分析等等
答案 0 :(得分:1)
在你的功能中,使用Anonymous Classes
使用不同的排序标准在现场实施Comparatorpublic function() {
for(int i = 0; i < number of different stats; i++) {
//sort by stat(i); Implement Comparator
//do some analysis
//sort by stat(i); Implement Comparator again
//do more analysis
}
}
答案 1 :(得分:0)
实现不同的比较器,每个类字段一个,并在循环中使用它们。
答案 2 :(得分:0)
您可以使用Bean Comparator。它允许您使用反射对Object中的任何属性进行排序。
答案 3 :(得分:0)
为了能够以紧凑的方式编写它,您可以自己定义一个sortBy方法。
@SuppressWarnings("unchecked")
static <A, B> void sortBy(List<A> list, Function<A, B> f) {
Collections.sort(list, (e1, e2) -> ((Comparable<B>)f.apply(e1)).compareTo(f.apply(e2)));
}
public void function(List<CompanyInfo> list) {
sortBy(list, c -> c.stat1);
//do some analysis
sortBy(list, c -> c.stat2);
//do some analysis
//etc.
}
但你仍然有一个问题,你不能简单地循环统计数据。为此,您必须将所有统计信息放入列表或哈希映射中。该列表可以例如属于List<Number>
类型。在最坏的情况下,您必须使用HashMap<String, Object>
并在必要时转换值。