当前位置: 首页 > 知识库问答 >
问题:

自定义对象排序不正确的Java PriorityQueue[重复]

靳涵亮
2023-03-14

我不完全理解如何对自定义对象使用Java PriorityQueue(最大堆)。

我正在研究LeetCode问题,代码必须按单词长度对句子中的单词重新排序。我的直觉是,我可以使用PriorityQueue来为我进行单词排序。为此,我想我可以使用自定义对象跟踪单词:

public class word implements Comparable<word>{
    public String theWord;
    public int len, order;
    public word(String w, int order) {
        this.theWord = w;
        this.order = order;
        this.len = w.length();
    }
    @Override
    public int compareTo(word o) {
        return this.len - o.len;                    // sorting behavior controlled here, right???
    }
    public String toString() {
        return this.theWord+"("+this.order+") ";    // for troubleshooting
    }
}

然后:

public String arrangeWords(String sentence) {

    PriorityQueue<word> maxHeap = new PriorityQueue<>(Comparator.naturalOrder());
    String[] words = sentence.split(" ");
    for( int i=0; i<words.length; i++ ) {
        maxHeap.offer( new word(words[i], i) );
    }
}

我用来测试的第一句话是“leetcode是很酷的”。(来自LC帖子。)

我希望的顺序是:“是很酷的leetcode”(最短到最长的语序)

但是当我运行上面的代码并检查调试器中的PriorityQueue时,我看到:

is(1)  leetcode(0)  cool(2)

所以。。。搞什么鬼?我根本不明白这是怎么订购的。这不是原始顺序(用括号表示),不是按长度顺序,甚至不是按字母顺序。我不知道PriorityQueue是如何决定如何对word对象排序的。我认为class word的compareTo()方法将强制执行我想要的排序。(我在其他SO帖子中看到过这一点。)但事实并非如此。有人知道我做错了什么吗?非常感谢。

共有2个答案

宋宏毅
2023-03-14

PriorityQueue(minHeap)坚持顶部元素的长度最低。其余元素将按随机顺序排列。一旦您轮询顶部元素,然后会发生重新排序(upHeapify-技术上),使剩余元素中最小的成为顶部元素。正如已经指出的,您需要轮询所有对象并使它们成为您句子的一部分。

另外,解决这个问题的另一种方法是-

class Solution {
   public static String arrangeWords(String text) {

        String str[] = text.split(" ");
        Arrays.sort(str, (a, b) -> a.length() - b.length());
        String res = "";
        for ( int i = 0; i< str.length; i++)
        {
            if ( i ==0 )
            {
                res += str[i].substring(0,1).toUpperCase()  + str[i].substring(1) + " ";
            }
            else{
                     res += str[i].substring(0,1).toLowerCase()  + str[i].substring(1) + " ";
            }
        }
        return res.trim();
    }

}
吕霄
2023-03-14

您将它们插入了优先级队列。但是,您需要轮询队列,以获得正确的单词顺序。

        while (!maxHeap.isEmpty()) {
            System.out.println(maxHeap.poll());
        }

此外,请注意,不会仅仅因为您在优先级队列中插入了顺序字段而对其进行更改。它只显示单词在原句中出现的顺序。

在插入的循环之后编写该循环。然后再次执行。您将看到正确的顺序。

 类似资料:
  • 我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:

  • 问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。

  • 我的列表中有这样一个< code>compareTo代码: 当我使用时,我得到以下错误: 当我将其更改为<code>if(this.long1 现在,重复确实发生了,需要正确排序。重复项是出现在第一个还是最后一个并不重要,只要它们按顺序正确分组,如下所示: 我该如何正确地做到这一点?谢谢你。 更新 该列表仍在按以下所有建议排序。这是因为它是一个

  • 我有一个的列表 其中是一个模型类,如下所示 null

  • 问题内容: 我不知道最好的方法是创建具有属性和方法的JavaScript对象。 我看过一些示例,该示例中的人员使用然后在所有功能中使用以确保范围始终正确。 然后,我看到了用于添加属性的示例,而其他示例则是内联的。 有人可以给我一个带有某些属性和方法的JavaScript对象的正确示例吗? 问题答案: 有两种用于在JavaScript中实现类和实例的模型:原型方式和闭包方式。两者都有优点和缺点,并且