日志排序 - 自定义排序不起作用
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.
对列表进行排序
正在尝试按升序对数组 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.
对列表进行排序