
本文旨在解决如何基于已有的 Comparator 创建用于比较自定义类型 IntIdx 的 Comparator。通过使用 Comparator.comparing(Function, Comparator) 方法,可以优雅地将外部传入的比较器应用于 IntIdx 对象的特定属性,并与其他比较规则组合,从而实现灵活的排序逻辑。
在Java中,Comparator 接口用于定义对象的排序规则。当我们需要对自定义类型进行排序,并且排序规则的一部分需要根据外部传入的 Comparator 来动态调整时,就需要一种方法将外部 Comparator 应用于自定义类型的特定属性。本文将介绍如何使用 Comparator.comparing(Function, Comparator) 方法来实现这一目标。
假设我们有以下 IntIdx 类:
private static class IntIdx { int val; int idx; IntIdx(int val, int idx) { this.val = val; this.idx = idx; } public int getValue() { return val; } public int getIdx() { return idx; }}
现在,我们希望创建一个 Comparator,它首先使用外部传入的 Comparator 比较 IntIdx 对象的 val 属性,然后使用自然顺序比较 idx 属性。
使用 Comparator.comparing(Function, Comparator)
Comparator.comparing(Function, Comparator) 方法接受两个参数:
硅基智能
基于Web3.0的元宇宙,去中心化的互联网,高质量、沉浸式元宇宙直播平台,用数字化重新定义直播
62 查看详情
一个 Function,用于从对象中提取需要比较的属性。一个 Comparator,用于比较提取出的属性。
以下代码展示了如何使用该方法创建 Comparator:
import java.util.Comparator;import java.util.List;import java.util.ArrayList;public class ComparatorExample { private static class IntIdx { int val; int idx; IntIdx(int val, int idx) { this.val = val; this.idx = idx; } public int getValue() { return val; } public int getIdx() { return idx; } @Override public String toString() { return "(" + val + ", " + idx + ")"; } } static public List decode(List al, Comparator valComp) { final Comparator idxComp = Comparator .comparing(IntIdx::getValue, valComp) .thenComparingInt(IntIdx::getIdx); // 示例:使用 Comparator 对 IntIdx 列表进行排序 List intIdxList = new ArrayList(); intIdxList.add(new IntIdx(3, 2)); intIdxList.add(new IntIdx(1, 1)); intIdxList.add(new IntIdx(3, 1)); intIdxList.add(new IntIdx(1, 2)); intIdxList.sort(idxComp); System.out.println("Sorted list: " + intIdxList); return null; // 仅仅为了满足方法签名,实际应用中应返回有意义的值 } public static void main(String[] args) { // 创建一个逆序的 Integer 比较器 Comparator reverseIntegerComparator = Comparator.reverseOrder(); // 创建一个示例 Integer 列表 List integerList = new ArrayList(); integerList.add(1); integerList.add(2); integerList.add(3); // 调用 decode 方法,传入 Integer 列表和逆序比较器 decode(integerList, reverseIntegerComparator); }}
在上述代码中,Comparator.comparing(IntIdx::getValue, valComp) 创建了一个 Comparator,它使用 valComp 比较 IntIdx 对象的 getValue() 方法的返回值。然后,thenComparingInt(IntIdx::getIdx) 将 idx 属性的自然顺序比较添加到比较规则中。
注意事项
确保传入的 Comparator 与 IntIdx 对象的 val 属性类型匹配。Comparator.comparing(Function, Comparator) 是 Java 8 引入的特性,需要使用 Java 8 或更高版本。如果不需要自定义的 Comparator,可以直接使用 Comparator.comparingInt(IntIdx::getValue),它使用自然顺序比较 IntIdx 对象的 val 属性。
总结
通过使用 Comparator.comparing(Function, Comparator) 方法,我们可以灵活地将外部传入的 Comparator 应用于自定义类型的特定属性,并与其他比较规则组合,从而实现动态的排序逻辑。这种方法比手动编写多行 lambda 表达式更加简洁和易于维护。
以上就是基于自定义Comparator创建Comparator的教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/244800.html
微信扫一扫
支付宝扫一扫