Java 根据对象的1个字段对对象列表进行排序

Java 根据对象的1个字段对对象列表进行排序,java,sorting,Java,Sorting,大家好,我的社区! 我是这些论坛的新手,对java和android编程也相当陌生——这恰好是我的问题所在——因此,对于任何错误,请提前表示歉意 我的问题是分类。我正在寻找一种基于我选择的字段对对象进行排序的方法(不是基于第一个字段进行排序,然后是下一个字段,以比较器链接为例)。我相信我已经找到了解决问题的办法: 但我在实际工作中遇到了困难。我怀疑我可能因为缺乏java经验而遗漏了一些东西,所以欢迎提供任何帮助 以下是我正在尝试的: 作为我的班级- public class ItemLocati

大家好,我的社区! 我是这些论坛的新手,对java和android编程也相当陌生——这恰好是我的问题所在——因此,对于任何错误,请提前表示歉意

我的问题是分类。我正在寻找一种基于我选择的字段对对象进行排序的方法(不是基于第一个字段进行排序,然后是下一个字段,以比较器链接为例)。我相信我已经找到了解决问题的办法:

但我在实际工作中遇到了困难。我怀疑我可能因为缺乏java经验而遗漏了一些东西,所以欢迎提供任何帮助

以下是我正在尝试的:

作为我的班级-

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刚刚告诉我实现必须返回一个整数!