简体   繁体   English

ArrayAdapter上的辅助排序

[英]Secondary sort on ArrayAdapter

i am trying to sort my Arrayadapter with it's sort-Method 我正在尝试使用它的sort-Method对Arrayadapter进行排序

@Override
public void sort(@NonNull Comparator<? super Task> comparator) {
    super.sort(comparator);
}

two times. 两次。

I'm using the two Comparators 我正在使用两个比较器

private static final Comparator TASKCOMPARATOR_TITLE = new Comparator<Task>() {
    @Override
    public int compare(Task a, Task b) {
        return a.getTitle().compareToIgnoreCase(b.getTitle());
    }
};

private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() {
    @Override
    public int compare(ViewHolder a, ViewHolder b) {
        return a.getTask().getDueTime().compareTo(b.getTask().getDueTime());
    }
};

like this 像这样

taskAdapter.sort(Util.getTASKCOMPARATOR_TITLE());
taskAdapter.sort(Util.getTASKCOMPARATOR_DUEDATE());

hoping to secondary sort the ArrayAdapter by the title and then by the Date. 希望通过标题然后按日期对ArrayAdapter进行二次排序。 The sort-Method of the ArrayAdapter is internally using ArrayAdapter的sort-Method在内部使用

public void sort(Comparator<? super T> comparator) {
    synchronized (mLock) {
        if (mOriginalValues != null) {
            Collections.sort(mOriginalValues, comparator);
        } else {
            Collections.sort(mObjects, comparator);
        }
    }
    if (mNotifyOnChange) notifyDataSetChanged();
}

I've read, that Collections.sort() is using a stable algorithm and therefore i'm wondering why the List of my ArrayAdapter is just being sorted by the last comparator i call. 我读过,Collections.sort()使用的是稳定算法,因此我想知道为什么ArrayAdapter的列表只是由我调用的最后一个比较器进行排序。

Can anyone tell me where i made a mistake and why the first sort()-call is being ignored by the second one? 谁能告诉我我在哪里犯了错误,为什么第二个忽略了第一个sort()调用?

EDIT 编辑

private static final Comparator TASKCOMPARATOR = new Comparator<Task>() {
    @Override
    public int compare(Task a, Task b) {
        int timeCompareResult = a.getDueTime().compareTo(b.getDueTime());
        if (timeCompareResult == 0) {
            return a.getTitle().compareToIgnoreCase(b.getTitle());
        } else {
            return timeCompareResult;
        }
    }
};

This works. 这可行。 I don't know if it's the only/best way. 我不知道这是唯一/最好的方法。

As Шах stated, use one comparator. 如Шах所述,使用一个比较器。 Comparator returns 0 on equals. 比较器返回等于0的值。 First compare on Title, if they are equal you go for the comparison on Time. 首先在标题上进行比较,如果它们相等,则在时间上进行比较。 I haven't ran the code, but it should be something like this: 我还没有运行代码,但是应该是这样的:

private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() {
    @Override
    public int compare(ViewHolder a, ViewHolder b) {
        int comparison = a.getTask().getTitle().compareToIgnoreCase(b.getTask().getTitle());

        if(comparison == 0){
            comparison = a.getTask().getDueTime().compareTo(b.getTask().getDueTime());
        }
        return comparison;
    }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM