我有一个字符串,我需要根据自定义顺序进行排序,并且我正在使用优先级队列,但优先级队列因重复而失败 [重复]

Posted

技术标签:

【中文标题】我有一个字符串,我需要根据自定义顺序进行排序,并且我正在使用优先级队列,但优先级队列因重复而失败 [重复]【英文标题】:I have a String I need to sort based on a custom order and I am using priority queues but the priority queue fails with duplicates [duplicate] 【发布时间】:2022-01-18 06:49:05 【问题描述】:
public class CustomSortString 

public String customSortString(String order, String s) 
    if (order == null || s == null) 
        return "";
    
    int len = s.length();
    PriorityQueue<Character> minHeap = new PriorityQueue<>(len, (a, b) -> 
        if (order.indexOf(a) > order.indexOf(b)) 
            return 1;
         else if (order.indexOf(a) < order.indexOf(b)) 
            return -1;
         else 
            return 0;
        
    );
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < len; i++) 
        minHeap.add(s.charAt(i));
    
    for (char c : minHeap) 
        result.append(c);
    
    return result.toString();


public static void main(String[] args) 
    // TODO Auto-generated method stub
    CustomSortString c = new CustomSortString();
    System.out.println(c.customSortString("kqep", "pekeq"));

但这并不能提供预期的结果。因为当我在添加所有元素后查看 minHeap 时,我看到了问题: enter image description here

由于某种原因,'e' 的分数不同,这导致程序失败。你能帮忙吗?

【问题讨论】:

【参考方案1】:

您实际上是通过for-each 循环来迭代这个队列:

for (char c : minHeap) 
     result.append(c);

因此每次迭代获取一个元素不会重建堆。见PriorityQueue#Itr#next

试试:

while (!minHeap.isEmpty()) 
    result.append(minHeap.poll());

【讨论】:

以上是关于我有一个字符串,我需要根据自定义顺序进行排序,并且我正在使用优先级队列,但优先级队列因重复而失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据自定义所需顺序对包含列表的数组列表进行排序

如何使用快速编码根据特定的排序顺序对自定义对象进行排序

根据对另一个 NSArray 字符串的排序,对自定义对象的 NSArray 进行排序

如何根据另一个字符串表定义的顺序对字符串表进行排序(Lua)

MySQL 根据自定义规则排序

sql 自定义排序