Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

Java中的Comparator自定义排序

Posted on 2023年11月16日 by hackdl

需求:将指定数据中的数据,按照字母中包含的数字大小进行排序

测试代码:

public static void main(String[] args) {
    List list = new ArrayList();
    list.add("QW34");
    list.add("QW21");
    list.add("QW12");
    list.add("QS34");
    list.add("QW45");

    // 自定义比较器,按指定顺序排序
    Comparator comparator = new Comparator() {
        @Override
        public int compare(String s1, String s2) {
            // 定义排序规则
            if (s1.contains("QW") && s2.contains("QW")) {
                String qw1 = s1.split("QW")[1];
                String qw2 = s2.split("QW")[1];
         服务器托管网       int i1 = Integer.parseInt(qw1);
                int i2 = Integer.parseInt(qw2);
                if (i1 > i2) {
                    return 1;
                } else if (i1  strings = new TreeSet(comparator);
    strings.addAll(list);

    // 使用自定义比较器对集合进行排序
   // Collections.sort(list, comparator);

    // 输出排序结果
    for (String s : strings) {
        System.out.println(s);
    }
}

Comparator介绍

Comparator接口中最重要的方法是compare,它接受两个参数并返回一个整数值,用于表示两个对象的比较结果。如果返回负数,表示第一个参数应该排在第二个参数之前;如果返回正数,表示第一个参数应该排在第二个参数之后;如果返回0,表示两个参数相等,顺序不变。

TreeSet的add方法是如何调用比较器的呢

查看add方法源码可以看到

treeSet的底层用的是的Map的put方法

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

继续查看put方法

public V put(K key, V value) {
    Entry t = root;
    if (t == null) {
    	//这个方法会调用自定义的比较器
        compare(key, key); // type (and possibly null) check

        root = new Entry(key, value, null);
        size = 1;
        modCount++;
        return null;
    }
    int cmp;
    Entry parent;
    // split comparator and comparable paths
    Comparator super K> cpr = comparator;
    if (cpr != null) {
        do {
            parent = t;
            cmp = cpr.compare(key, t.key);
            if (cmp  0)
                t = t.right;
            else
                return t.setValue(value);
        } while (t != null);
    }
    else {
        if (key == null)
            throw new NullPointerException();
        @SuppressWarnings("unchecked")
            Comparable super K> k = (Comparable super K>) key;
        do {
            parent = t;
            cmp = k.compareTo(t.key);
            if (cmp  0)
                t = t.right;
            else
                return t.setValue(value);
        } while (t != null);
    }
    Entry e = new Entry(key, value, parent);
    if (cmp 

put方法中的compare方法

final int compare(Object k1, Object k2) {
    //会判读你是否自定义了比较器,如果如果自定义了比较器,则会先试用自定义的比较器进行比较
    return comparator==null ? ((Comparable super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
    //那如果没有定义比较器,则会使用对象对应类的类型默认的比较方法,比如String类中的compareTo方法
}

注意

TreeSet服务器托管网 stringTreeSet = new TreeSet();
stringTreeSet.add(new Blog());

如果添加的是对象,对象也没有实现comparable接口,则会报错

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net

Related posts:

  1. 乌兰42u机柜租用
  2. 江西云手机服务器托管云主机:安全高效的云端服务
  3. 不展现报表直接打印
  4. 三亚市弹性云服务器托管
  5. 香港光云数据中心:高效、可靠的服务器托管服务

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: 从真实案例出发,全方位解读 NebulaGraph 中的执行计划
下一篇: Pandas 分组聚合操作详解

最新更新

  • Python机器学习框架的比较和选择
  • MySQL 与主流分支版本上执行 ANALYZE TABLE 安全么?
  • vscode远程连接ubuntu
  • 【源码系列#02】Vue3响应式原理(Effect)
  • Python时间序列分析与预测

随机推荐

  • 编解码学习笔记(十三):容器(上篇)
  • opengauss高可用之主备分开搭建
  • 为什么要学习数据结构和算法?
  • 海南服务器托管服务全面解析
  • 云服务器托管租用指南

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8