Java - 如何对具有不同属性的对象的向量进行排序
Java - How to sort vector of objects with different attributes
我有一个对象向量。
class companyInfo {
String name;
int stat1;
int stat2;
double stat3;
double stat4;
double stat5;
}
我知道如何通过使用其中一个属性实现比较器来对向量进行排序,但我需要能够动态排序。例如
public function() {
for(int i = 0; i < number of different stats; i++) {
//sort by stat(i);
//do some analysis
}
}
以便我可以按指定的统计数据对矢量进行排序,对矢量进行一些分析。然后按另一个统计数据排序,进行相同的分析等等
实现不同的比较器,每个 class 字段一个,并在循环中使用它们。
在你的函数中,使用不同的排序标准当场实现 Comparator,使用 Anonymous Classes
public 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
}
}
您可以使用 Bean Comparator。它允许您使用反射对对象中的任何 属性 进行排序。
为了能够以紧凑的方式编写此代码,您可以自己定义一个 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>
并在必要时转换值。
我有一个对象向量。
class companyInfo {
String name;
int stat1;
int stat2;
double stat3;
double stat4;
double stat5;
}
我知道如何通过使用其中一个属性实现比较器来对向量进行排序,但我需要能够动态排序。例如
public function() {
for(int i = 0; i < number of different stats; i++) {
//sort by stat(i);
//do some analysis
}
}
以便我可以按指定的统计数据对矢量进行排序,对矢量进行一些分析。然后按另一个统计数据排序,进行相同的分析等等
实现不同的比较器,每个 class 字段一个,并在循环中使用它们。
在你的函数中,使用不同的排序标准当场实现 Comparator,使用 Anonymous Classes
public 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
}
}
您可以使用 Bean Comparator。它允许您使用反射对对象中的任何 属性 进行排序。
为了能够以紧凑的方式编写此代码,您可以自己定义一个 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>
并在必要时转换值。