日志排序 - 自定义排序不起作用

Log sorting - Custom sorting is not working

正在尝试按升序对数组 0f 日志版本进行排序。我可以通过直接实现 Comparator as

来让它工作
 Arrays.sort(input, new CustomComparator())

并在 CustomComparator class 中编写与以下代码相同的逻辑(来自 Parse class)。但是,当我尝试通过在队列中添加值来对其进行排序时,排序不起作用。

import java.util.*;

public class LogSorting {

    public static void main(String[] args) {
        String[] input = {"2.10.0", "1.0.100", "1.0.1", "1.1.100", "2.1.10", "1.1.1"};
        PriorityQueue<Parse> str = new PriorityQueue<>();
        for (String i : input) {
            String[] result = i.split("\.");
            str.add(new Parse(Integer.parseInt(result[0]), Integer.parseInt(result[1]), Integer.parseInt(result[2])));
        }
        for (Parse p : str) {
            System.out.println(p.major + " " + p.minor + " " + p.patch);
        }
    }
}

class Parse implements Comparable<Parse> {
    int major;
    int minor;
    int patch;

    Parse(int major, int minor, int patch) {
        this.major = major;
        this.minor = minor;
        this.patch = patch;
    }

    public int compareTo(Parse p) {

        if (major == p.major && minor == p.minor)
            return Integer.compare(patch, p.patch);
        if (major == p.major)
            return Integer.compare(minor, p.minor);
        return Integer.compare(major, p.major);
    }
}

输出

1 0 1

1 1 100

1 0 100

2 10 0

2 1 10

1 1 1

输出应排序为 1 0 1, 1 0 100, 1 1 1, 1 1 100, 2 1 10, 2 10 0

它不是一个排序数组,因此您可以从一个元素转到具有较小元素的那个 priority.The 方法 iterator() 中提供的迭代器不保证在任何情况下遍历 PriorityQueue 的元素特定顺序。如果需要有序遍历,可以考虑使用

Arrays.sort(pq.toArray()).

或者你可以

    while (!str.isEmpty()) {
        Parse p = str.peek();
        str.remove();
        System.out.println(p.major + " " + p.minor + " " + p.patch);
    }

但这会清空队列。

我现在知道你为什么要使用优先队列了。如果您只想排序列表,请使用 List,然后使用 comparable/comparator.

对列表进行排序