在两个字段上排序自定义对象数组

问题描述:

我在两个字段上排序自定义对象数组(ListData[])。我希望它按照主题排序,并按名称排序。我以为我在自定义对象类中做了一个很好的比较器,并且我可以使用Arrays.sort(ld)来使我的代码工作并对我的数组进行排序。但很显然,即时通讯做错了什么......在两个字段上排序自定义对象数组

我的自定义对象:

public class ListData implements Comparable<ListData>{ 
public int venueID; 
public String name; 
public String photoUrl; 
public String tip; 
public String theme; 
@Override 
public int compareTo(ListData ld0) { 
    return this.venueID- ld0.venueID; 
} 

public static Comparator<ListData> ListDataThemeAndNameComparator = new Comparator<ListData>() { 
    @Override 
    public int compare(ListData ld1, ListData ld2) { 

     String compareTheme1 = ld1.theme.toUpperCase(); 
     String compareTheme2= ld2.theme.toUpperCase(); 
     String compareName1 = ld1.name.toUpperCase(); 
     String compareName2= ld2.name.toUpperCase(); 

     //ascending 
     int comp = compareTheme1.compareTo(compareTheme2); // comp themes 
     if(comp==0){ // same theme 
      comp= compareName1.compareTo(compareName2); // compare names 
     } 
     return comp; 
     } 
}; 


} 

在我的主要活动,我有:

ListData ld[]= new ListData[jsonResponse.size()]; 
(some code filling my ListData array) 
Arrays.sort(ld, ListData.ListDataThemeAndNameComparator); // compare by theme and then by name 

有谁知道我做错了吗?

我编辑了我的代码但它仍然失败,现在在compareTheme1 = ld1.theme.toUpperCase();上出现nullpointerexception。但我相信我的数组不是空的,我在排序它之前记录了它的行,并且它充满了大约500个项目。

您的ListData对象应该实现Comparable而不是Comparator接口。

EDIT:

为了把事情说清楚,你可以在array通过Array.sort()排序。要进行自定义排序,您可以在Array.sort()中指定比较器,如果不这样做,数组将按自然顺序排序,您可以通过实现Comparable接口来定义数组。所以,你有两个选择如何自定义排序:

  • 通过使用自定义比较,并通过实施Comparable界面,您的项目

我会建议你在Array.sort()

  • 指定它一起去实现Comparable 。通过不创建新的比较对象可以节省内存,如果比较不属于您的情况的不同类型的对象,则Comparator非常有用。

  • +0

    我编辑了我的代码,现在我有其他错误(在我的问题中解释)。感谢您的贡献,但只有将比较变成可比较的(以及进口等)并不能解决我的问题。 – Jasper 2012-07-23 10:04:33

    +0

    你的数组可能不是空的,但似乎你的一些元素没有主题字段初始化。检查主题和名称为null。 – biegleux 2012-07-23 10:08:49

    +0

    你说得对。我有一些空的字段在数组的末尾,因为我宣布了一个大数组。我将其更改为arraylist,但是当我使用正确的数字它的工作。 – Jasper 2012-07-23 10:22:29