2012-08-02 62 views
3

Hello stackoverflow社区! 我是新来的这些论坛,也相当新的java和android编程 - 这恰好是我的问题的对象 - 所以任何失误提前抱歉!根据其字段中的1对对象列表排序

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

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

,但我有麻烦却越来越这项工作。我怀疑我可能因为缺乏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; 
     } 
    }); 
} 

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

感谢您的帮助!

回答

8

如果不相等,则不应从Comparator.compare方法返回0。这是“好”的合同,但不完全鼓励,从API文档:

这是一般的情况,但并不严格要求(比较(X, Y)== 0)==( x.equals(Y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。 推荐的语言是“注意:此比较器强制排列 与等号不一致。”


在我看来,你应该返回为每个字段,而不是特定的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); 
} 
+0

谢谢先生!我包括返回0的原因是因为日食告诉我,该方法必须返回一个整数,我不知道还有什么要放!这是一个更简单的实现来理解来自C++背景!再次感谢你! – user1549672 2012-08-02 20:56:22

0

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

首先,你可以尝试是把一个额外的其他情况下,像这样:

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

此刻,如果你有在你的调用代码一个错字,比较总是返回0,这将离开列表未排序。

路过现场将宣布一个枚举的更健壮的方式:

enum ItemLocationField { 
    TITLE, 
    ID 
} 

那么你的条件将成为:

if (field == ItemLocationField.TITLE) 

等。这将减少发生错字的可能性(编译器会告诉你,如果你这样做)。

0

除了returning 0和比较参数equals我没有看到任何错误。您可以通过throwing RuntimeException而不是returning 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 ."); 
     } 
    }); 
} 
+0

我认为这主要是由于我缺乏java的经验...... Eclipse只是告诉我,实现必须返回一个整数! – user1549672 2012-08-02 21:00:02

0

如果要排序的基础只有一个属性的物体上,然后用Collections.sort(List<T> list)

2.java.lang.Comparable接口沿着如果要排序的对象在以上属性,然后去 java.util.Comparator接口连同Collections.sort(List<T> list, Comparator<? super T> c)

+0

谢谢!我主要是在寻找一种基于包含MULTIPLE属性的对象的ONE属性进行排序的方法! – user1549672 2012-08-02 20:58:10

+0

亚..这就是我的第一点建议.....排序基于一个属性。第二点是附加知识 – 2012-08-03 04:55:59

相关问题