ArrayAdapter 的二次排序
Secondary sort on ArrayAdapter
我正在尝试用它 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 列表只是按我调用的最后一个比较器排序。
谁能告诉我哪里出错了,为什么第一个 sort() 调用被第二个调用忽略了?
编辑
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;
}
}
};
这行得通。我不知道这是不是 only/best 方式。
如Шах所述,使用一个比较器。
比较器 returns 0 等于。
先比较Title,如果相等就比较Time。
我没有 运行 代码,但它应该是这样的:
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;
}
};
我正在尝试用它 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 列表只是按我调用的最后一个比较器排序。
谁能告诉我哪里出错了,为什么第一个 sort() 调用被第二个调用忽略了?
编辑
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;
}
}
};
这行得通。我不知道这是不是 only/best 方式。
如Шах所述,使用一个比较器。 比较器 returns 0 等于。 先比较Title,如果相等就比较Time。 我没有 运行 代码,但它应该是这样的:
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;
}
};