PriorityQueue
与普通队列不同,优先队列元素是按排序顺序检索的。
假设我们想以升序检索元素。在这种情况下,优先队列的头是最小的元素。检索到该元素后,下一个最小的元素将成为队列的头。
PriorityQueue<Integer> numbers = new PriorityQueue<>();
这里,我们创建了一个没有任何参数的优先级队列。在这种情况下,优先级队列的头是队列中最小的元素。元素将按升序从队列中移除。
comparator
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
//创建优先级队列
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}
class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer number1, Integer number2) {
int value = number1.compareTo(number2);
//元素以相反的顺序排序
if (value > 0) {
return -1;
}
else if (value < 0) {
return 1;
}
else {
return 0;
}
}
}
在以上所有示例中,优先级队列元素都是按自然顺序(升序)检索的。 但是,我们可以自定义此顺序。
为此,我们需要创建自己的comparator类,它实现了Comparator接口。
如果你是直接想创建大顶堆,就是直接比较存入的数据的大小,那么这样写就行,大顶堆就是后面减前面的
PriorityQueue<Integer>pq=new PriorityQueue<>((o1,o2)->o2.compareTo(o1));
如果你想以别的,比如这个key在map里对应的value的大小,然后建立大顶堆,那么应该重写compare
PriorityQueue<Integer>pq=new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b)
{
return map.get(b)-map.get(a);
}
});
List<int[]>
刷力扣遇到了这种用法,
List<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1,2,3});
list.add(new int[]{4,5});
是一个列表,其中每个元素都是一个int类型的数组,这个列表可以用来存储一组整数数组,每个数组可以有不同的长度和元素。
转成int[][][][][][][] [],因为有的傻逼题目会要你写成int [] [] 返回
list.toArray(new int[list.size()][]);
Arrays.asList()
把数组转成List
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = Arrays.asList(myArray);
//上面两个语句等价于下面一条语句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");
Arrays.sort
重写排序规则
Arrays.sort(nums,new Comparator<String>(){
public int compare(String s1,String s2)
{
return (s1+s2).compareTo(s2+s1);//升序就是前面比后面
}
});