Java PriorityQueue Comparator 在特定条件下插入二维数组
Java PriorityQueue Comparator to insert a 2D array under certain conditions
我有一个二维数组 arr= [[1,4],[4,4],[2,2],[3,4],[1,1]]
我想按照以下顺序将其存储在 PriorityQueue 中:
[[1,1],[2,2],[1,4],[3,4],[4,4]]
即
如果两个数组的第一个元素相同,则第二个元素值较小的应该先出现
如果两个数组的第二个元素相同,那么第一个元素值较小的应该先出现
否则第二个元素值小的应该先出现
我尝试了以下代码:
import java.io.*;
import java.util.*;
class Check2
{
public static void main(String[] args) {
int events[][]={{1,4},{4,4},{2,2},{3,4},{1,1}};
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
{
@Override
public int compare(int a[][], int b[][])
{
int res=-1;
if(a[0][1]==b[0][1])
{
if(a[0][0]>b[0][0])
res=-1;
else
res=1;
}
else
{
if(a[0][1]>b[0][1])
res=-1;
else
res=1;
}
}
}
);
}
}
我收到以下错误:
Check2.java:8: error: <anonymous Check2> is not abstract and does not override abstract method compare(Integer,Integer) in Comparator
{
^
Check2.java:9: error: method does not override or implement a method from a supertype
@Override
^
Check2.java:7: error: incompatible types: int[][] cannot be converted to int
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
3 errors
我知道比较函数不适用于此处的二维数组,但我该如何获得结果。
我尝试通过检查所有地方来实施其他技术,但没有成功。请帮忙
排队
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
您提供集合作为第一个参数,但 PriorityQueue
没有这样的构造函数。您不能在一个构造函数中提供比较器和集合。
而且您仍然不需要在 PriorityQueue
中存储 int[][]
来解决这个问题,而是存储 int[]
。
public static void main(String[] args) {
int[][] events ={{1,4},{4,4},{2,2},{3,4},{1,1}};
PriorityQueue<int[]> min_heap = new PriorityQueue<>((x, y) -> {
if(x[0] != y[0]) {
return Integer.compare(x[0], y[0]);
}
if(x[1] != y[1]) {
return Integer.compare(x[1], y[1]);
}
return 0;
});
min_heap.addAll(Arrays.asList(events));
while(min_heap.peek() != null) {
System.out.println(Arrays.toString(min_heap.poll()));
}
}
输出:
[1, 1]
[1, 4]
[2, 2]
[3, 4]
[4, 4]
PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
for (int[] a: arr) {
minHeap.offer(a);
}
我有一个二维数组 arr= [[1,4],[4,4],[2,2],[3,4],[1,1]]
我想按照以下顺序将其存储在 PriorityQueue 中: [[1,1],[2,2],[1,4],[3,4],[4,4]]
即
如果两个数组的第一个元素相同,则第二个元素值较小的应该先出现
如果两个数组的第二个元素相同,那么第一个元素值较小的应该先出现
否则第二个元素值小的应该先出现
我尝试了以下代码:
import java.io.*;
import java.util.*;
class Check2
{
public static void main(String[] args) {
int events[][]={{1,4},{4,4},{2,2},{3,4},{1,1}};
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
{
@Override
public int compare(int a[][], int b[][])
{
int res=-1;
if(a[0][1]==b[0][1])
{
if(a[0][0]>b[0][0])
res=-1;
else
res=1;
}
else
{
if(a[0][1]>b[0][1])
res=-1;
else
res=1;
}
}
}
);
}
}
我收到以下错误:
Check2.java:8: error: <anonymous Check2> is not abstract and does not override abstract method compare(Integer,Integer) in Comparator
{
^
Check2.java:9: error: method does not override or implement a method from a supertype
@Override
^
Check2.java:7: error: incompatible types: int[][] cannot be converted to int
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
3 errors
我知道比较函数不适用于此处的二维数组,但我该如何获得结果。
我尝试通过检查所有地方来实施其他技术,但没有成功。请帮忙
排队
PriorityQueue<int[][]> min_heap= new PriorityQueue<int[][]>(events ,new Comparator<Integer>()
您提供集合作为第一个参数,但 PriorityQueue
没有这样的构造函数。您不能在一个构造函数中提供比较器和集合。
而且您仍然不需要在 PriorityQueue
中存储 int[][]
来解决这个问题,而是存储 int[]
。
public static void main(String[] args) {
int[][] events ={{1,4},{4,4},{2,2},{3,4},{1,1}};
PriorityQueue<int[]> min_heap = new PriorityQueue<>((x, y) -> {
if(x[0] != y[0]) {
return Integer.compare(x[0], y[0]);
}
if(x[1] != y[1]) {
return Integer.compare(x[1], y[1]);
}
return 0;
});
min_heap.addAll(Arrays.asList(events));
while(min_heap.peek() != null) {
System.out.println(Arrays.toString(min_heap.poll()));
}
}
输出:
[1, 1]
[1, 4]
[2, 2]
[3, 4]
[4, 4]
PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
for (int[] a: arr) {
minHeap.offer(a);
}