请原谅我对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
语句:
- 它们是一样的吗?
- 左边的
30
吗? - 正确的
30
吗? - 左边的
35
吗? - 正确的
35
吗? - 左边的
40
吗? - 正确的
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
如果这不是解决方案,请详细说明问题,可能是我或其他任何人会帮助你。