基于其中一个字段对对象列表进行排序

use*_*672 3 java sorting

你好stackoverflow社区!我是这些论坛的新手,也是java和android编程的新手 - 这恰好是我的问题的对象 - 所以很抱歉任何错误!

我的问题是排序.我正在寻找一种方法来根据我选择的字段对对象进行排序(不是基于第一个字段进行排序,然后是下一个,例如比较器链接).我相信我找到了解决问题的方法:

/sf/answers/357917591/

但我实际上遇到了麻烦.我怀疑由于缺乏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并对其进行排序,但无济于事.

谢谢您的帮助!

dac*_*cwe 8

如果它们不相等,你不应该0Comparator.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)