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

Java中实现优先级队列自定义比较器的问题

柴宏浚
2023-03-14
1. Given a list of Files with name convention xx_yy_zz.dat .<br/>
2.xx,yy,zz can be from 00-50 <br/>
3.I need to process the files with xx=30 first,xx=35 second xx=40 third and then the rest.<br/>

由于我对优先级队列的了解有限,所以我尝试实现它,但只能在asc或desc值xx中排序,这不是必需的。
我的方法是

请分享一些想法/方法。

看来很遗憾,我无法为我的情况提供所需的比较器。
不过,还是要在期待中感谢你

共有1个答案

韩华美
2023-03-14

可以在compare()方法中使用简单的if语句来检查一个字符串是否以“30”开头,而另一个字符串不以“30”开头。那么您就知道这个字符串必须在另一个之前。在文件名的第一部分运行以下if语句:

  1. 它们相同吗?
  2. 左边是30吗?
  3. 正确吗30
  4. 左边是35吗?
  5. 是不是35
  6. 左边是40吗?
  7. 是不是40

比较器可能如下所示:

public int compare(String a, String b) {
    String[] splitA = a.split("_");
    String[] splitB = b.split("_");

    if (splitA[0].equals(splitB[0])) {
        return 0;
    }
    if (splitA[0].equals("30")) {
        return -1;
    }
    if (splitB[0].equals("30")) {
        return 1;
    }
    if (splitA[0].equals("35")) {
        return -1;
    }
    if (splitB[0].equals("35")) {
        return 1;
    }
    if (splitA[0].equals("40")) {
        return -1;
    }
    if (splitB[0].equals("40")) {
        return 1;
    }
    return 0;
}
System.out.println(Arrays.toString(data));
Arrays.sort(data, new SpecialComparator());
System.out.println(Arrays.toString(data));
[30_45_35.dat, 00_12_34.dat, 35_50_20.dat, 40_03_05.dat, 33_28_14.dat,
 30_16_31.dat, 20_29_23.dat, 24_41_29.dat, 30_49_18.dat, 40_12_13.dat]

[30_45_35.dat, 30_16_31.dat, 30_49_18.dat, 35_50_20.dat, 40_03_05.dat,
 40_12_13.dat, 00_12_34.dat, 33_28_14.dat, 20_29_23.dat, 24_41_29.dat]

(为清晰起见添加了新行)

正如您看到的,首先是30,然后是唯一的35第二,然后是40第三,然后是所有剩余的东西。如果compareTo方法返回0以便对字符串进行更好的“子排序”,您可能希望对字符串使用compareTo(),根据上面的基本排序,子排序将相等。

 类似资料:
  • priority_queue,comparator(query,d)>min_heap; main.cpp:20:7:注意:“comparator”不是文字,因为: class comparator{ main.cpp:20:7:注意:“comparator”不是聚合,没有普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数 Main.cpp:92:65:注意:应为类型,但

  • 我使用的是PriorityQueue和我自己的比较器,但最终结果并不总是好的。我应该按平均成绩、姓名、身份证进行排序。最后,它应该返回队列中剩余的名称。其余的名字都很好,但顺序不同。输入(名称、平均等级、识别号): 预期产出: 我的结果: 你能帮我找出问题所在吗?提前谢谢你!

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 有人能解释一下这里使用的比较运算符的语法吗?它是做什么的

  • 我试图用自定义比较器定义优先级队列,如下所示: 这就是显示的编译错误 我还尝试在测试类中声明另一个比较函数,但没有效果。为什么主函数中的优先级队列编译而类中的优先级队列不编译?为比较器定义专用类是这里唯一的工作吗?谢谢你。

  • 我不理解的是返回或的含义。如果返回,则哪个元素首先被推送到队列中,如果返回则是哪个元素?