字母数字列排序不正确
Alphanumeric column sorting incorrectly
我正在尝试对包含字母和数字的发票编号列表进行排序。当按降序排序时,我希望发票编号 - 192685 排在发票编号 - 19s100619916001 之前,但我得到的结果恰恰相反。我怎样才能把这些按正确的顺序排列?我的代码如下:
public static void assertSortedAlphaNumerics(Grid grid, String header, boolean isAscending) {
List<String> original = grid.getColumn(header);
List<String> originalFormatted = new ArrayList<String>();
Collections.replaceAll(original, null, "");
// convert list to lowercase
original = original.stream().map(String::toLowerCase).collect(Collectors.toList());
for (int i = 0; i < original.size(); i++) {
String originalWithoutCharacters = original.get(i).replaceAll(("[^A-Za-z0-9 ]"), "");
originalFormatted.add(originalWithoutCharacters);
}
ArrayList<String> sorted = new ArrayList<String>(originalFormatted);
if (isAscending) {
Collections.sort(sorted); // sort ascending
} else {
Collections.sort(sorted, Collections.reverseOrder()); // sort descending
}
assertEquals("Alphanumeric column is not sorted: " +
header + " expected: \n" +
sorted + "\nbut got:\n" +
originalFormatted,
sorted,
originalFormatted);
}
我在下面包含了预期和实际输出。这是一个很大的列表,但只有 192685 不合适。请看下面的例子:
预期输出:1604、1606、1609、1610、1702、1733747、1854、18687、18687、18691、18709、18710、18713、18713、18720、192685、19S100619191616001、19S1006202272001、2002001、200261、200261、200261、200261、200261、200261、200236、200261,200261,20036、200236]
实际输出:[1604、1606、1609、1610、1702、1733747、1854、18687、18687、18691、18709、18710、18713、18713、18720、19S10061999916001、19S100620272001、19262681、192685,200264 = 1324,200241,2334]
我运行的步骤是:
public void the_table_can_be_sorted(String table) throws Exception {
switch (table) {
case "Invoices Awaiting Approval":
sortInvoicesAwaitingApproval();
break;
case "All Jobs":
sortAllJobs();
break;
default:
throw new Exception("Cannot find table on page");
}
}
导致:
private void sortInvoicesAwaitingApproval() throws ParseException {
Grid grid;
String[] headersInvoicesAwaitingApproval = {"Invoice Ref", "Invoice Date", "Order Ref", "Budget", "Supplier", "Site", "Net ($)", "Tax ($)", "Gross ($)"};
for (String header : headersInvoicesAwaitingApproval) {
runtimeState.invoicesAwaitingApprovalPage.tableSort(header, RandomUtils.nextBoolean());
outputHelper.takeScreenshot();
grid = runtimeState.invoicesAwaitingApprovalPage.getGrid();
boolean isAscending = runtimeState.invoicesAwaitingApprovalPage.isAscending(header);
String order = isAscending ? "ascending" : "descending";
runtimeState.scenario.write("Asserting " + header + " column is sorted in " + order + " order");
switch (header){
case "Invoice Date":
GridHelper.assertSortedDates(grid, header, "M/d/yyyy", isAscending);
break;
case "Net ($)":
case "Tax ($)":
case "Gross ($)":
GridHelper.assertSortedNumerics(grid, header, isAscending);
break;
default:
GridHelper.assertSortedAlphaNumerics(grid, header, isAscending);
}
}
}
似乎一个简单的 Collections.sort(list)
给了你首选的输出。
List<String> input = Arrays.asList("1604", "1606", "1609", "1610", "1702", "1733747", "1854", "18687", "18691", "18709", "18710", "18713", "18720", "192685", "19s100619916001", "19s100620272001", "20083461");
Collections.shuffle(input);
List<String> output = new ArrayList<>(input);
Collections.sort(output);
List<String> outputReversed = new ArrayList<>(output);
Collections.sort(outputReversed, Collections.reverseOrder());
证明:
相反的顺序也有效:
我正在尝试对包含字母和数字的发票编号列表进行排序。当按降序排序时,我希望发票编号 - 192685 排在发票编号 - 19s100619916001 之前,但我得到的结果恰恰相反。我怎样才能把这些按正确的顺序排列?我的代码如下:
public static void assertSortedAlphaNumerics(Grid grid, String header, boolean isAscending) {
List<String> original = grid.getColumn(header);
List<String> originalFormatted = new ArrayList<String>();
Collections.replaceAll(original, null, "");
// convert list to lowercase
original = original.stream().map(String::toLowerCase).collect(Collectors.toList());
for (int i = 0; i < original.size(); i++) {
String originalWithoutCharacters = original.get(i).replaceAll(("[^A-Za-z0-9 ]"), "");
originalFormatted.add(originalWithoutCharacters);
}
ArrayList<String> sorted = new ArrayList<String>(originalFormatted);
if (isAscending) {
Collections.sort(sorted); // sort ascending
} else {
Collections.sort(sorted, Collections.reverseOrder()); // sort descending
}
assertEquals("Alphanumeric column is not sorted: " +
header + " expected: \n" +
sorted + "\nbut got:\n" +
originalFormatted,
sorted,
originalFormatted);
}
我在下面包含了预期和实际输出。这是一个很大的列表,但只有 192685 不合适。请看下面的例子:
预期输出:1604、1606、1609、1610、1702、1733747、1854、18687、18687、18691、18709、18710、18713、18713、18720、192685、19S100619191616001、19S1006202272001、2002001、200261、200261、200261、200261、200261、200261、200236、200261,200261,20036、200236]
实际输出:[1604、1606、1609、1610、1702、1733747、1854、18687、18687、18691、18709、18710、18713、18713、18720、19S10061999916001、19S100620272001、19262681、192685,200264 = 1324,200241,2334]
我运行的步骤是:
public void the_table_can_be_sorted(String table) throws Exception {
switch (table) {
case "Invoices Awaiting Approval":
sortInvoicesAwaitingApproval();
break;
case "All Jobs":
sortAllJobs();
break;
default:
throw new Exception("Cannot find table on page");
}
}
导致:
private void sortInvoicesAwaitingApproval() throws ParseException {
Grid grid;
String[] headersInvoicesAwaitingApproval = {"Invoice Ref", "Invoice Date", "Order Ref", "Budget", "Supplier", "Site", "Net ($)", "Tax ($)", "Gross ($)"};
for (String header : headersInvoicesAwaitingApproval) {
runtimeState.invoicesAwaitingApprovalPage.tableSort(header, RandomUtils.nextBoolean());
outputHelper.takeScreenshot();
grid = runtimeState.invoicesAwaitingApprovalPage.getGrid();
boolean isAscending = runtimeState.invoicesAwaitingApprovalPage.isAscending(header);
String order = isAscending ? "ascending" : "descending";
runtimeState.scenario.write("Asserting " + header + " column is sorted in " + order + " order");
switch (header){
case "Invoice Date":
GridHelper.assertSortedDates(grid, header, "M/d/yyyy", isAscending);
break;
case "Net ($)":
case "Tax ($)":
case "Gross ($)":
GridHelper.assertSortedNumerics(grid, header, isAscending);
break;
default:
GridHelper.assertSortedAlphaNumerics(grid, header, isAscending);
}
}
}
似乎一个简单的 Collections.sort(list)
给了你首选的输出。
List<String> input = Arrays.asList("1604", "1606", "1609", "1610", "1702", "1733747", "1854", "18687", "18691", "18709", "18710", "18713", "18720", "192685", "19s100619916001", "19s100620272001", "20083461");
Collections.shuffle(input);
List<String> output = new ArrayList<>(input);
Collections.sort(output);
List<String> outputReversed = new ArrayList<>(output);
Collections.sort(outputReversed, Collections.reverseOrder());
证明:
相反的顺序也有效: