问题描述
请原谅我对Java中优先级队列和比较器的理解。
看来,我能够基于某种排序顺序为Priority Queue实现基本的比较器。
但在以下情况下我无法提出一些建议:
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/>
由于我对Priority Queue的了解有限,因此我尝试实现它,但我只能以xx的asc或desc值进行排序,而这并不是必需的。
我的方法是
将文件名列表放入优先级队列,在正则表达式“ _”上分割文件名 然后使用比较器基于它的值比较拆分数组的第一个索引,但是正如我所料,我失败了,因为我的要求有所不同
请分享一些想法/方法。
可悲的是,我无法为我的案例提供所需的比较器。
尽管如此,感谢您的期待
解决方法
您可以在if
方法内使用简单的compare()
语句来检查一个字符串是否以"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,40_12_13.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)));
});
q.add("23lk");
q.add("22lkjl");
q.add("45ljl");
for(String str : q) {
System.out.println(str);
}
}
}
adn输出
22lkjl
23lk
45ljl
如果这不是解决方案,请详细说明问题,也许是我或其他人会帮助您。