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

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

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

https://stackoverflow.com/a/5113108/1549672

但我实际上遇到了麻烦。 我怀疑由于缺乏java经验,我可能会遗漏一些东西,所以欢迎任何帮助!

这是我正在尝试的:

作为我的class级 –

public class ItemLocation { String title; int id; } 

作为我的职能 –

 public void sort(final String field, List itemLocationList) { Collections.sort(itemLocationList, new Comparator() { @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; } }); } 

使用这些,有人可能会举一个使用这种方法的例子吗? 我试图填充一个ArrayList并对其进行排序,但无济于事。

谢谢您的帮助!

如果它们不相等,则不应从Comparator.compare方法返回0 。 合同中的“okey”,但不完全鼓励,来自API文档:

通常情况是这样,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。 一般来说,任何违反此条件的比较器都应清楚地表明这一事实。 推荐的语言是“注意:这个比较器强加了与equals不一致的排序。”


在我看来,你应该为每个字段返回一个特定的Comparator器:

 Comparator titleComparator = new Comparator() { @Override public int compare(ItemLocation o1, ItemLocation o2) { return o1.title.compareTo(o2.title); } } Comparator idComparator = new Comparator() { @Override public int compare(ItemLocation o1, ItemLocation o2) { return Integer.valueOf(o1.id).compareTo(o2.id); } } public void sort(final String field, List itemLocationList) { final Comparator 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); } 

你可以发布不起作用的调用代码吗? 我看不出你提供的代码有什么明显错误。

首先,您可能会尝试更多其他情况:

 else { throw new IllegalArgumentException("Unrecognised field name"); } 

目前,如果您的调用代码中有拼写错误,则比较器将始终返回0,这将使列表保持未分类状态。

传递该字段的更强大的方法是声明一个枚举:

 enum ItemLocationField { TITLE, ID } 

那你的条件会变成:

 if (field == ItemLocationField.TITLE) 

等等。 这样可以减少输入拼写错误的机会(如果你这样做,编译器会告诉你)。

除了returning 0并将参数与equals进行比较之外,我没有看到任何错误。 您可以通过throwing RuntimeException而不是returning 0并使用equalsIgnoreCase而不是equals方法来改进它,最好忽略参数的情况。

 public static void sort(final String field, List itemLocationList) { Collections.sort(itemLocationList, new Comparator() { @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 ."); } }); } 

1.如果要仅基于一个属性对对象进行排序,则转到java.lang.Comparable接口以及Collections.sort(List list)

2.如果要根据多个属性对对象进行排序,请转到java.util.Comparator接口以及Collections.sort(List list, Comparator c)