我不完全理解如何对自定义对象使用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帖子中看到过这一点。)但事实并非如此。有人知道我做错了什么吗?非常感谢。
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();
}
}
您将它们插入了优先级队列。但是,您需要轮询队列,以获得正确的单词顺序。
while (!maxHeap.isEmpty()) {
System.out.println(maxHeap.poll());
}
此外,请注意,不会仅仅因为您在优先级队列中插入了顺序字段而对其进行更改。它只显示单词在原句中出现的顺序。
在插入的循环之后编写该循环。然后再次执行。您将看到正确的顺序。
我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:
问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见
问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。
我的列表中有这样一个< code>compareTo代码: 当我使用时,我得到以下错误: 当我将其更改为<code>if(this.long1 现在,重复确实发生了,需要正确排序。重复项是出现在第一个还是最后一个并不重要,只要它们按顺序正确分组,如下所示: 我该如何正确地做到这一点?谢谢你。 更新 该列表仍在按以下所有建议排序。这是因为它是一个
我有一个的列表 其中是一个模型类,如下所示 null
问题内容: 我不知道最好的方法是创建具有属性和方法的JavaScript对象。 我看过一些示例,该示例中的人员使用然后在所有功能中使用以确保范围始终正确。 然后,我看到了用于添加属性的示例,而其他示例则是内联的。 有人可以给我一个带有某些属性和方法的JavaScript对象的正确示例吗? 问题答案: 有两种用于在JavaScript中实现类和实例的模型:原型方式和闭包方式。两者都有优点和缺点,并且