ArrayAdapter上的二级排序

时间:2017-04-07 23:40:04

标签: android sorting secondary-sort

我正在尝试使用它的sort-Method

对Arrayadapter进行排序
@Override
public void sort(@NonNull Comparator<? super Task> comparator) {
    super.sort(comparator);
}

两次。

我正在使用两个比较器

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());
    }
};
像这样

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

希望通过标题然后按日期对ArrayAdapter进行二级排序。 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();
}

我已经读过,Collections.sort()正在使用一个稳定的算法,因此我想知道为什么我的ArrayAdapter的List只是被我调用的最后一个比较器排序。

有谁能告诉我我犯了哪个错误,为什么第一次排序() - 第二次被忽略了?

修改

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;
        }
    }
};

这很有效。我不知道这是唯一/最好的方式。

1 个答案:

答案 0 :(得分:0)

如Шах所述,使用一个比较器。 比较器在等于时返回0。 首先在Title上进行比较,如果它们相等,你可以在时间上进行比较。 我没有运行代码,但它应该是这样的:

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;
    }
};