在 Java 中为优先级队列实现自定义比较器时出现问题



请原谅我对Java中优先级队列和比较器的理解。
似乎,我能够根据某种排序顺序实现优先级队列的基本比较器。
但我无法为以下情况想出一些东西:
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 中排序,这不是要求。
我的方法是

将文件名列表放在优先级队列中,在正则表达式"_"上拆分文件名 然后使用基于它的比较器值比较拆分数组的第一个索引,但正如预期的那样,我惨败了,因为我的要求不同

请分享一些想法/方法。

似乎很遗憾,我无法为我的情况提出所需的比较器。
尽管如此,还是在期待中感谢你

可以在compare()方法中使用简单的if语句来检查一个字符串是否以"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));

您可能会得到这样的输出(取决于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(),以防compareTo方法返回0以获得更好的字符串"子排序",根据上面的基本排序,这将是相等的。

可能是我不明白你到底需要什么...但是只需尝试此代码,如果开头有两位数,它会对所有字符串进行排序

public static void main(String[] args) {

PriorityQueue<String> q = new PriorityQueue<String>((first, second) -> {
return Integer.parseInt(first.substring(0, 2)) - Integer.parseInt(second.substring(0, 2));
//and if you want to reverse order, simply add "-" like this:
//return -(Integer.parseInt(first.substring(0, 2)) - Integer.parseInt(second.substring(0, 2)));
});

q.add("23lk");
q.add("22lkjl");
q.add("45ljl");
for(String str : q) {
System.out.println(str);
}
}
}

和输出

22lkjl
23lk
45ljl

如果这不是解决方案,请详细说明问题,可能是我或其他任何人会帮助你。

相关内容

  • 没有找到相关文章

最新更新