我有两个数组。其中一个包含唯一的名称,例如 Mike2、Mike3、Mike1,按我需要的顺序排序。第二个包含独特的姓氏和名字:“布什迈克1”,“克林顿迈克2”, “特朗普迈克3”。我需要一种更快的方法来按第一个数组的顺序对第二个数组进行排序。 对于我的示例,正确答案是:
Clinton Mike2
Trump Mike3
Bush Mike1
我该怎么做?
为了解决这个问题,我会说创建一个 Map (使用 HashMap,因为根据设计,Hashmap 检索名称索引所需的时间更少,无论其大小如何,请检查 this 以获取更多信息),使用 HashMap 来将每个名称与其第一个名称数组中的索引映射,
然后使用比较器提取每个全名的姓名部分(我假设你的格式是“姓氏”),并将其与 HashMap 中的映射索引进行比较,以确定它们的顺序
这是一个伪代码:
function SortFullNames:
var: namesArray, fullNamesArray
//map the name to its index
nameToIndex = new Map
// put the names and indexes pairs
For each name in namesArray with index i:
nameToIndex[name] = i
//custom comparator to sort full names
Function customComparator(fullNameA, fullNameB):
namePartA = //use space as a 'separator' to extract the name only
namePartB = //same
// Compare map indices
indexA = nameToIndex[namePartA]
indexB = nameToIndex[namePartB]
//result
If indexA < indexB:
Return -1
Else if indexA > indexB:
Return 1
Else:
Return 0
//Sort using your comparator
Sort fullNamesArray using customComparator
Return fullNamesArray
End function
假设要排序的名称列表 (sortData) 与排序所基于的列表中的每个条目完全包含一个匹配项(我们称之为 sortOrder),您可以简单地运行 sortOrder 并将每个元素替换为匹配的元素来自 sortData 的一个:
public static void main(String[] args) {
String[] sortOrder = new String[]{"Mike2", "Mike3", "Mike1"};
String[] sortData = new String[]{"Bush Mike1", "Clinton Mike2", "Trump Mike3"};
System.out.println("Before: " + String.join(", ", Arrays.asList(sortOrder)));
for (int i = 0; i < sortOrder.length; i++) {
String o = sortOrder[i];
Optional<String> possibleMatch = Arrays.stream(sortData).filter(data -> data.contains(o)).findFirst();
int finalI = i; // lambdas need an effectivly final variable
possibleMatch.ifPresent(data -> sortOrder[finalI] = data);
}
System.out.println("After: " + String.join(", ", Arrays.asList(sortOrder)));
}
}
之前: 迈克2、迈克3、迈克1
之后: 克林顿迈克2、特朗普迈克3、布什迈克1