你好stackoverflow社区!我是这些论坛的新手,也是java和android编程的新手 - 这恰好是我的问题的对象 - 所以很抱歉任何错误!
我的问题是排序.我正在寻找一种方法来根据我选择的字段对对象进行排序(不是基于第一个字段进行排序,然后是下一个,例如比较器链接).我相信我找到了解决问题的方法:
但我实际上遇到了麻烦.我怀疑由于缺乏java经验,我可能会遗漏一些东西,所以欢迎任何帮助!
这是我正在尝试的:
作为我的班级 -
public class ItemLocation {
String title;
int id;
}
Run Code Online (Sandbox Code Playgroud)
作为我的职能 -
public void sort(final String field, List<ItemLocation> itemLocationList) {
Collections.sort(itemLocationList, new Comparator<ItemLocation>() {
@Override
public int compare(ItemLocation o1, ItemLocation o2) {
if(field.equals("title")) {
return o1.title.compareTo(o2.title);
} else if(field.equals("id")) {
return Integer.valueOf(o1.id).compareTo(o2.id);
}
return 0;
}
});
}
Run Code Online (Sandbox Code Playgroud)
使用这些,有人可能会举一个使用这种方法的例子吗?我试图填充一个ArrayList并对其进行排序,但无济于事.
谢谢您的帮助!
如果它们不相等,你不应该0从Comparator.compare方法返回.合同中的"okey",但不完全鼓励,来自API文档:
通常情况是这样,但并非严格要求(compare(x,y)== 0)==(x.equals(y)).一般来说,任何违反此条件的比较器都应清楚地表明这一事实.推荐的语言是"注意:这个比较器强加了与equals不一致的排序."
在我看来,你应该Comparator为每个字段返回一个特定的字段:
Comparator<ItemLocation> titleComparator = new Comparator<ItemLocation>() {
@Override
public int compare(ItemLocation o1, ItemLocation o2) {
return o1.title.compareTo(o2.title);
}
}
Comparator<ItemLocation> idComparator = new Comparator<ItemLocation>() {
@Override
public int compare(ItemLocation o1, ItemLocation o2) {
return Integer.valueOf(o1.id).compareTo(o2.id);
}
}
public void sort(final String field, List<ItemLocation> itemLocationList) {
final Comparator<ItemLocation> comparator;
if(field.equals("title")) {
comparator = titleComparator;
} else if (field.equals("id")) {
comparator = idComparator;
} else {
throw new IllegalArgumentException("Comparator not found for " + field);
}
Collections.sort(itemLocationList, comparator);
}
Run Code Online (Sandbox Code Playgroud)