AOSP 存储库中的 SortCursor 如何对其值进行排序

How does the SortCursor from the AOSP repository sort it's values

我正在尝试使用 SortCursor class from the AOSP mentioned in How to represent 2 cursors as 1 sorted cursor?。但是,它似乎根本无法对我提供的游标进行排序。排序是如何进行的?

示例代码:

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。

关于 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