如何编写Comparator将列表中与输入值相等的元素移至顶部
实现将指定元素移至列表顶部的Comparator写法
嘿,这需求其实挺常见的,咱们直接上可运行的代码,再拆解逻辑:
首先得提个小坑:Arrays.asList()返回的是固定大小的列表,直接调用sort()会抛出异常,所以得先转成可变的ArrayList。接下来是核心的Comparator实现:
import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; public class Main { public static void main(String[] args) { // 原列表 List<String> myList = Arrays.asList("1234", "1214", "1334"); // 需要置顶的目标值 String mInput = "1214"; // 转成可变列表,避免排序时抛出UnsupportedOperationException List<String> mutableList = new ArrayList<>(myList); // 自定义Comparator,把目标元素移到最前面 Comparator<String> targetTopComparator = (a, b) -> { boolean aIsTarget = mInput.equals(a); boolean bIsTarget = mInput.equals(b); if (aIsTarget && !bIsTarget) { return -1; // 让目标元素a排在非目标元素b前面 } else if (!aIsTarget && bIsTarget) { return 1; // 让目标元素b排在非目标元素a前面 } else { return 0; // 非目标元素之间保持原有相对顺序 } }; // 执行排序 mutableList.sort(targetTopComparator); // 输出结果:[1214, 1234, 1334] System.out.println(mutableList); } }
逻辑拆解
这个Comparator的核心逻辑非常直观:
- 每次比较两个元素时,先判断它们是不是我们要置顶的目标值
- 如果其中一个是目标、另一个不是,就调整返回值让目标元素排在前面
- 如果两个都不是(或者都是目标),就返回0,保持它们原来的相对位置(这是稳定排序的特性,不会打乱其他元素的原有顺序)
额外说明
如果你的原列表本身就是可变的(比如直接创建的ArrayList),那可以跳过转列表的步骤,直接调用sort()方法就行。
内容的提问来源于stack exchange,提问作者Devrath
相关产品推荐
相关产品推荐

