LinkedList声明时传入Comparator编译失败,请求排查问题原因
问题分析与解决
你的代码编译失败主要有几个关键问题,我逐个给你拆解:
1. LinkedList没有接收Comparator的构造方法
Java里的LinkedList类的构造函数并不支持直接传入Comparator作为参数——它的构造选项只有:
- 空参构造(创建空链表)
- 接收一个
Collection的构造(把集合元素转成链表)
你想通过传入Comparator来让列表保持有序?那找错类了!如果需要自带排序逻辑的有序List,Java标准库没有直接的实现,但你可以用两种方式解决:
- 方式一:先创建普通LinkedList,之后调用
Collections.sort()传入你的Comparator来排序 - 方式二:如果需要插入时就自动排序,可以考虑用
TreeSet(但它是Set,不允许重复),或者自己封装一个基于LinkedList的有序列表逻辑。
2. 代码里的语法错误
除了构造方法的问题,你的代码还有两个小语法错误:
@override应该写成@Override(Java注解的O必须大写,否则编译器不识别这是重写注解)- 比较逻辑里的
arr[1]是笔误!你定义的参数是arr2,这里应该是arr2[0]或者arr2[1](取决于你想比较数组的哪个元素),比如return arr1[0] - arr2[0];,不然编译器会找不到arr这个变量。
修正后的示例代码
如果你只是想创建LinkedList之后排序,代码可以改成这样:
// 先创建空的LinkedList List<Integer[]> eventLst = new LinkedList<>(); // 先添加一些元素(示例) eventLst.add(new Integer[]{3, 5}); eventLst.add(new Integer[]{1, 2}); eventLst.add(new Integer[]{2, 4}); // 调用Collections.sort传入自定义Comparator完成排序 Collections.sort(eventLst, new Comparator<Integer[]>() { @Override public int compare(Integer[] arr1, Integer[] arr2) { // 这里假设你想比较数组的第一个元素,可根据需求修改 return arr1[0] - arr2[0]; } });
如果需要插入时就自动维持有序,那可以考虑用TreeSet(注意处理重复元素的逻辑),比如:
// TreeSet接收Comparator,插入时自动排序 Set<Integer[]> eventSet = new TreeSet<>(new Comparator<Integer[]>() { @Override public int compare(Integer[] arr1, Integer[] arr2) { int compareFirst = arr1[0] - arr2[0]; // 如果第一个元素相同,比较第二个元素,避免TreeSet认为是相同元素而丢弃 return compareFirst != 0 ? compareFirst : arr1[1] - arr2[1]; } }); // 添加元素会自动按规则排序 eventSet.add(new Integer[]{3, 5}); eventSet.add(new Integer[]{1, 2}); eventSet.add(new Integer[]{2, 4}); // 如果需要转成List,直接用LinkedList的构造方法 List<Integer[]> eventLst = new LinkedList<>(eventSet);
内容的提问来源于stack exchange,提问作者Hrushikesh
相关产品推荐
相关产品推荐

