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

问题描述


请原谅我对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语句:

  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,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

如果这不是解决方案,请详细说明问题,也许是我或其他人会帮助您。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...