Как SortCursor из репозитория AOSP сортирует свои значения

Я пытаюсь использовать SortCursor из AOSP, упомянутого в Как представить 2 курсора как 1 отсортированный курсор?. Однако, похоже, он вообще не сортирует курсоры, которые я даю. Как работает сортировка?

Пример кода:

String[] columnNames = {"name", "value"};

MatrixCursor matrixCursor1 = new MatrixCursor(columnNames);
matrixCursor1.addRow(new String[]{"cursor 1 value A", "9"});
matrixCursor1.addRow(new String[]{"cursor 1 value B", "2"});
matrixCursor1.addRow(new String[]{"cursor 1 value C", "1"});

MatrixCursor matrixCursor2 = new MatrixCursor(columnNames);
matrixCursor2.addRow(new String[]{"cursor 2 value A", "70"});
matrixCursor2.addRow(new String[]{"cursor 2 value B", "8"});
matrixCursor2.addRow(new String[]{"cursor 2 value C", "6"});

Cursor sortCursor = new SortCursor(new Cursor[]{matrixCursor1, matrixCursor2}, columnNames[1]);
while (sortCursor.moveToNext()) {
    String name = sortCursor.getString(sortCursor.getColumnIndexOrThrow(columnNames[0]));
    String value = sortCursor.getString(sortCursor.getColumnIndexOrThrow(columnNames[1]));;
    Log.v("SortCursor", "Name: " + name + ", Value: " + value);
}
sortCursor.close();

Вывод, когда я запускаю этот код:

V/SortCursor: Name: cursor 2 value A, Value: 70
V/SortCursor: Name: cursor 2 value B, Value: 8
V/SortCursor: Name: cursor 2 value C, Value: 6
V/SortCursor: Name: cursor 1 value A, Value: 9
V/SortCursor: Name: cursor 1 value B, Value: 2
V/SortCursor: Name: cursor 1 value C, Value: 1

Как видите, значения полностью не отсортированы. Я бы ожидал 1, 2, 6, 8, 9, 70.


person nibarius    schedule 13.02.2016    source источник


Ответы (1)


Есть две важные вещи, которые нужно знать о SortCursor.

1. Он считывает значения из курсоров как строки, а не числа, поэтому строка "70" меньше строки "8".

2. Он сравнивает следующее значение каждого курсора только тогда, когда ищет наименьшее значение. Таким образом, каждый отдельный курсор должен быть отсортирован, прежде чем он будет передан SortCursor.

Таким образом, в приведенном примере «70» меньше «9», поэтому оно идет первым, затем «8» меньше, чем «9», поэтому идет дальше, «6» меньше, чем «9», поэтому идет дальше. Тогда остаются только значения в первом курсоре.

Как вы видите, курсор, который вы использовали, на самом деле отсортирован, просто он не отсортирован так, как вы ожидаете.

Если вы отсортируете свои отдельные курсоры перед созданием SortCursor и используете строки вместо чисел, вы получите ожидаемый результат.

MatrixCursor matrixCursor1 = new MatrixCursor(columnNames);
matrixCursor1.addRow(new String[]{"cursor 1 value C", "01"});
matrixCursor1.addRow(new String[]{"cursor 1 value B", "02"});
matrixCursor1.addRow(new String[]{"cursor 1 value A", "09"});

MatrixCursor matrixCursor2 = new MatrixCursor(columnNames);
matrixCursor2.addRow(new String[]{"cursor 2 value C", "06"});
matrixCursor2.addRow(new String[]{"cursor 2 value B", "08"});
matrixCursor2.addRow(new String[]{"cursor 2 value A", "70"});

Дам тебе

V/SortCursor: Name: cursor 1 value C, Value: 01
V/SortCursor: Name: cursor 1 value B, Value: 02
V/SortCursor: Name: cursor 2 value C, Value: 06
V/SortCursor: Name: cursor 2 value B, Value: 08
V/SortCursor: Name: cursor 1 value A, Value: 09
V/SortCursor: Name: cursor 2 value A, Value: 70
person nibarius    schedule 13.02.2016