Java中如何根据子字符串的出现次数对数组进行排序?

问题描述 投票:0回答:2

我有两个数组。其中一个包含唯一的名称,例如 Mike2、Mike3、Mike1,按我需要的顺序排序。第二个包含独特的姓氏和名字:“布什迈克1”,“克林顿迈克2”, “特朗普迈克3”。我需要一种更快的方法来按第一个数组的顺序对第二个数组进行排序。 对于我的示例,正确答案是:

Clinton Mike2
Trump Mike3
Bush Mike1

我该怎么做?

java arrays sorting
2个回答
0
投票

为了解决这个问题,我会说创建一个 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

0
投票

假设要排序的名称列表 (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

© www.soinside.com 2019 - 2024. All rights reserved.