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

0g0grzrc  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(458)

请原谅我对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,这不是必需的。
我的方法是
将文件名列表放在优先级队列中,在regex“\上拆分文件名,然后根据它的值使用comparator比较拆分数组的第一个索引,但正如预期的那样,我失败了,因为我的要求有所不同
请分享一些想法/方法。
遗憾的是,我并没有为我的案例找到一个必要的比较标准。
尽管如此,我还是期待着你的到来

ecbunoof

ecbunoof1#

你可以用简单的 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, 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 为了得到更好的“子排序”字符串,这将是平等的基础上这个基本排序以上。

n3h0vuf2

n3h0vuf22#

也许我不明白你到底需要什么。。。但是只要尝试一下这个代码,如果字符串的开头有两个数字,它就会给我排序

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);
        }
    }
}

adn输出

22lkjl
23lk
45ljl

如果不能解决这个问题,请详细解释问题,也许我或其他人会帮助你。

相关问题