TreeSet 自定义比较器算法 .. 字符串比较

2024-03-19

从提供的输入字符串:

{ "200,400,7,1", "100,0,1,1", "200,200,3,1", "0,400,11,1", "407,308,5,1","100,600,9,1" },

我在 TreeSet 中添加相同的内容,并希望它按第三个元素顺序排序,因此预期输出将是:

(100,0,1,1) (200,200,3,1) (407,308,5,1) (200,400,7,1) (100,600,9,1) (0,400,11,1)

但我的实际输出是:

(100,0,1,1)(0,400,11,1)(200,200,3,1)(407,308,5,1)(200,400,7,1)(100,600,9,1)

但由于 11 的字符串比较小于 9 但就整数而言, 11>9 。我的预期输出越来越不同。建议我一些解决同样问题的想法。

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetComparator {

    public static void main(String[] args) {
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                String aStr = a;
                String bStr = b;
                String[] splitA = aStr.split(",");
                String[] splitB = bStr.split(",");

                return splitA[2].compareTo(splitB[2]);
            }
        };

        String[] arr = { "200,400,7,1", "100,0,1,1", "200,200,3,1",
                "0,400,11,1", "407,308,5,1", "100,600,9,1" };

        TreeSet<String> ts = new TreeSet<String>(comparator);
        for (String str : arr) {
            ts.add(str);
        }

        for (String element : ts)
            System.out.print(element + " ");

    }
}

您正在按字典顺序排序("123"出现在之前"20"),你需要做的就是将它们转换为整数,然后比较它们:

Not:

return splitA[2].compareTo(splitB[2]);

but:

return Integer.valueOf(splitA[2]).compareTo(Integer.valueOf(splitB[2]));

However, a somewhat cleaner way would be to create a custom object holding these 4 different values and then create a Comparator that compares the 3rd value of such an object:

下列:

public class Main {
    public static void main (String[] args) {

        Comparator<CustomObject> sortOn3rdValue = new Comparator<CustomObject>() {
            @Override
            public int compare(CustomObject o1, CustomObject o2) {
                return o1.v3 < o2.v3 ? -1 : o1.v3 > o2.v3 ? 1 : 0;
            }
        };

        Set<CustomObject> objects = new TreeSet<CustomObject>(sortOn3rdValue);

        String[] arr = { "200,400,7,1", "100,0,1,1", "200,200,3,1", "0,400,11,1", "407,308,5,1", "100,600,9,1" };

        for(String a : arr) {
            objects.add(new CustomObject(a.split(",")));
        }

        for(CustomObject co : objects) {
            System.out.println(co);
        }
    }
}

class CustomObject {

    final int v1, v2, v3, v4;

    CustomObject(String[] strValues) {
        // assume strValues.lenght == 4
        v1 = Integer.valueOf(strValues[0]);
        v2 = Integer.valueOf(strValues[1]);
        v3 = Integer.valueOf(strValues[2]);
        v4 = Integer.valueOf(strValues[3]);
    }

    @Override
    public String toString() {
        return String.format("(%d,%d,%d,%d)", v1, v2, v3, v4);
    }
}

会打印:


(100,0,1,1)
(200,200,3,1)
(407,308,5,1)
(200,400,7,1)
(100,600,9,1)
(0,400,11,1)  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TreeSet 自定义比较器算法 .. 字符串比较 的相关文章

随机推荐

  • 启动长时间后台任务

    用户请求我网站上的某些页面 我想做的事 向用户发送快速答案并启动需要很长时间的后台任务 看起来像 public ActionResult index var task new Task Stuff start task async task
  • 删除自定义 ActionBar 中的多余空间

    我的问题涉及使用完全自定义的 ActionBar 视图 因为这对于我的客户希望 ActionBar 的工作方式是必要的 我已经删除了徽标 标题和其他所有可能的内容 但是 ActionBar 的自定义视图不会一直延伸到整个屏幕 我尝试了以下方
  • 单击图像时播放 MP3

    我想在单击网站中的某个图像时播放 MP3 文件 我还想隐藏 MP3 文件 我怎样才能做到这一点 我尝试了这段代码 但没有任何反应
  • BOT/蜘蛛陷阱创意

    我有一个客户 他的域名似乎受到 DDoS 攻击的严重打击 在日志中 看起来很正常的具有随机 IP 的用户代理 但它们翻阅页面的速度太快 不像人类 他们似乎也没有要求任何图像 我似乎找不到任何模式 我怀疑这是一群 Windows 僵尸 客户过
  • 更快地重新连接 CBPeripheral

    我正在开发一个应用程序 它可以多次连接和断开不同的蓝牙低功耗外围设备 经过在互联网上的大量研究 我没有找到一种方法来存储已经发现的服务和特征 以便我可以更快地重新连接 目前 我正在每次重新连接后发现所需的服务和特征 这花费了我 1 5 到
  • 打字稿错误 get 调用需要 0 个类型参数

    我收到打字稿错误预期 0 类型参数 但返回 get 调用的行却得到 1 我的通话有什么问题吗 public get params SummaryParams Observable
  • “OutOfMemoryException”读取 20mb XLSX 文件

    我在用着NPOI https www nuget org packages NPOI 来处理Excel文件 这是我读取文件的方式 using FileStream stream File OpenRead excelFilePath IWo
  • fill-rule="evenodd" 如何在星形 SVG 上工作

    当我试图理解时 我看到了以下 svg 形状fill rule in SVG div class contain demo div
  • 该浮点数小数部分的前 32 位是多少?

    我正在看以下内容SHA256 伪代码 http en wikipedia org wiki SHA 2 SHA 256 28a SHA 2 variant 29 pseudocode在维基百科上 具体来说 我正在查看以下部分 Initial
  • 打印文本而不是 C 枚举中的值

    int main enum Days Sunday Monday Tuesday Wednesday Thursday Friday Saturday Days TheDay int j 0 printf Please enter the
  • EF 映射对象的不兼容数据读取器异常

    我正在使用实体框架并更新了表及其存储过程 但在调用存储过程时出现以下错误 数据读取器与指定的不兼容 FormValueModel Valuation 类型的成员 ValuationId 确实 数据读取器中没有同名的相应列 Valuation
  • 如何设计一个带有需要引用自身的表的数据库?

    我正在构建一个数据库 但遇到了一个我似乎无法解决的问题 数据库比图中复杂得多 但问题可以归纳为下面的表结构 问题是每个员工都有一个经理 每个经理都是员工 看起来这些表必须互相引用 但是 当我设置它时 这似乎无法正常工作 我正在使用cakep
  • 使用单个服务器端变量处理多个复选框

    我有以下 HTML 代码
  • C#:例如集合的封装

    我想知道其中哪一个被认为是最干净或最好用的以及为什么 其中一个公开乘客列表 允许用户添加和删除等 另一个隐藏列表 只允许用户枚举它们并使用特殊方法添加 实施例1 class Bus public IEnumerable
  • Android模拟器源码在哪里

    当我几周前更新 Android Studio 时 不同组件的新版本也会自动更新 与 Android 模拟器的情况一样 我现在的版本 29 2 3 5916265 有一个错误 降级似乎非常非常困难 在最新版本的模拟器中 模拟 GPX 轨道的布
  • Interval 属性更改时 System.Timer 的行为

    我有一个 System Timer 设置 每天凌晨 2 点触发一个事件 如果计时器启动的进程失败那么我想要计时器 重置为每 15 分钟运行一次 直到该过程成功完成 this is how the timer is set up this i
  • String[] 内存使用情况

    我将字符串数组声明为 String items1 new String 5 String items2 new String 20 如果这两个数组都只包含 2 个元素 会对内存和性能产生多大影响 你可以自己测试一下 public stati
  • Spring Security - 即使凭据正确,身份验证也不起作用

    我在我的应用程序中使用 spring security 拦截一些 URL 进行身份验证 虽然网址 securemapping1 通过显示登录页面提示用户登录 但是登录不起作用 即使我提供了正确的凭据 我也会返回登录页面 凭据错误 错误通过调
  • AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条

    UPDATE1 开始使用ngProgress http victorbjelkholm github io ngProgress 但在 IE 中没有给出所需的效果 最终更新 找到最佳解决方案 请参阅下面的最后一个答案 AngularJS 应
  • TreeSet 自定义比较器算法 .. 字符串比较

    从提供的输入字符串 200 400 7 1 100 0 1 1 200 200 3 1 0 400 11 1 407 308 5 1 100 600 9 1 我在 TreeSet 中添加相同的内容 并希望它按第三个元素顺序排序 因此预期输出