Java 根据对象的1个字段对对象列表进行排序
大家好,我的社区! 我是这些论坛的新手,对java和android编程也相当陌生——这恰好是我的问题所在——因此,对于任何错误,请提前表示歉意 我的问题是分类。我正在寻找一种基于我选择的字段对对象进行排序的方法(不是基于第一个字段进行排序,然后是下一个字段,以比较器链接为例)。我相信我已经找到了解决问题的办法: 但我在实际工作中遇到了困难。我怀疑我可能因为缺乏java经验而遗漏了一些东西,所以欢迎提供任何帮助 以下是我正在尝试的: 作为我的班级-Java 根据对象的1个字段对对象列表进行排序,java,sorting,Java,Sorting,大家好,我的社区! 我是这些论坛的新手,对java和android编程也相当陌生——这恰好是我的问题所在——因此,对于任何错误,请提前表示歉意 我的问题是分类。我正在寻找一种基于我选择的字段对对象进行排序的方法(不是基于第一个字段进行排序,然后是下一个字段,以比较器链接为例)。我相信我已经找到了解决问题的办法: 但我在实际工作中遇到了困难。我怀疑我可能因为缺乏java经验而遗漏了一些东西,所以欢迎提供任何帮助 以下是我正在尝试的: 作为我的班级- public class ItemLocati
public class ItemLocation {
String title;
int id;
}
作为我的职责-
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;
}
});
}
public void排序(最终字符串字段,List itemLocationList){
Collections.sort(itemLocationList,newcomparator(){
@凌驾
公共整数比较(ItemLocation o1、ItemLocation o2){
如果(字段等于(“标题”)){
返回o1.title.compareTo(o2.title);
}else if(字段等于(“id”)){
返回Integer.valueOf(o1.id).compareTo(o2.id);
}
返回0;
}
});
}
使用这些,有人可能给出一个使用这种方法的例子吗?我试图填充ArrayList并对其进行排序,但没有成功
谢谢你的帮助 如果它们不相等,则不应从方法返回
0
。合同规定“可以”,但API文档并不鼓励:
通常情况下,但并非严格要求(比较(x,
y) ==0)==(x等于(y))。一般来说,任何比较国
违反此条件的,应明确指出这一事实。这个
建议使用的语言是“注意:这个比较器强加的排序
与平等不一致。”
在我看来,您应该为每个字段返回一个特定值:
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);
}
Comparator titleComparator=新的比较器(){
@凌驾
公共整数比较(ItemLocation o1、ItemLocation o2){
返回o1.title.compareTo(o2.title);
}
}
比较器idComparator=新比较器(){
@凌驾
公共整数比较(ItemLocation o1、ItemLocation o2){
返回Integer.valueOf(o1.id).compareTo(o2.id);
}
}
公共无效排序(最终字符串字段,列表项位置列表){
最终比较器;
如果(字段等于(“标题”)){
比较器=滴定比对器;
}else if(字段等于(“id”)){
比较器=idComparator;
}否则{
抛出新的IllegalArgumentException(“未找到“+字段的比较器”);
}
Collections.sort(itemLocationList,comparator);
}
您能发布不起作用的呼叫代码吗?我看不出你提供的代码有什么明显的错误
首先,您可以尝试将一个额外的else设置为:
else {
throw new IllegalArgumentException("Unrecognised field name");
}
此时,如果调用代码中有输入错误,比较器将始终返回0,这将使列表未排序
传递字段的更可靠的方法是声明枚举:
enum ItemLocationField {
TITLE,
ID
}
那么你的情况就会变成:
if (field == ItemLocationField.TITLE)
等等。这将减少输入错误的几率(编译器会告诉您是否输入错误)。我没有发现任何错误,除了
返回0
并将参数与的值进行比较。您可以通过抛出RuntimeException
而不是返回0
来改进它,并使用equalsIgnoreCase
而不是equals
方法,最好忽略参数的大小写
public static void sort(final String field, List<ItemLocation> itemLocationList) {
Collections.sort(itemLocationList, new Comparator<ItemLocation>() {
@Override
public int compare(ItemLocation o1, ItemLocation o2) {
if(field.equalsIgnoreCase("title")) {
return o1.title.compareTo(o2.title);
} else if(field.equalsIgnoreCase("id")) {
return Integer.valueOf(o1.id).compareTo(o2.id);
}else
throw new IllegalArgumentException("Invalid Parameter .");
}
});
}
公共静态无效排序(最终字符串字段,列表项位置列表){
Collections.sort(itemLocationList,newcomparator(){
@凌驾
公共整数比较(ItemLocation o1、ItemLocation o2){
if(字段等信号案例(“标题”)){
返回o1.title.compareTo(o2.title);
}else if(field.equalsIgnoreCase(“id”)){
返回Integer.valueOf(o1.id).compareTo(o2.id);
}否则
抛出新的IllegalArgumentException(“无效参数”);
}
});
}
1.如果您只想基于一个属性对对象进行排序,请选择java.lang.Compariable
界面以及集合。排序(列表)
2.如果要根据多个属性对对象进行排序,请选择
java.util.Comparator
接口以及Collections.sort清单0,比较器谢谢你,先生!我的原因是返回Eclipse是告诉我,方法必须返回一个整数,我不确定还有什么要放!这是一个更简单的实现,从C++背景中理解!再次感谢!我主要是寻找一种基于一个排序的方法。包含多个属性的对象的属性!耶..这是我的第一点建议的..基于一个属性排序。第二点是额外知识的附加部分我认为这主要是由于我缺乏java经验…Eclipse刚刚告诉我实现必须返回一个整数!