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
我正在尝试使用 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