【问题标题】:sorting custom object array on two fields在两个字段上对自定义对象数组进行排序
【发布时间】:2012-07-23 08:44:35
【问题描述】:

我正在对两个字段上的一组自定义对象 (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(); 上出现空指针异常。但我确信我的数组不是空的,我在排序之前记录了它,它填充了大约 500 个项目。

【问题讨论】:

    标签: android arrays sorting custom-object


    【解决方案1】:

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

    EDIT:

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

    • 通过使用自定义比较器并在Array.sort() 中指定它
    • 通过为您的项目实现Comparable 接口

    我建议您实施Comparable。您可以通过不创建新的比较器对象来节省内存,如果您要比较不同类型的对象,Comparator 很有用。

    【讨论】:

    • 我编辑了我的代码,现在我有另一个错误(在我的问题中解释)。感谢您的贡献,但仅将比较器更改为可比较(当然还有导入等)并不能解决我的问题。
    • 您的数组可能不为空,但您的某些元素似乎尚未初始化主题字段。检查主题和名称是否为空。
    • 你是对的。我在数组的末尾有一些空字段,因为我声明了一个大数组。我将其更改为arraylist,但是当我使用正确的数字时它起作用了。
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多