使用大量字符串比较...有没有比简单的.equals()更好的方法?

时间:2014-06-19 15:19:29

标签: java string

我正在编写一个数据密集型程序,需要进行大量的字符串比较,但我觉得.equals()是一种非常昂贵的方法。是否有更有效的比较字符串的方法?

编辑:

我有两个包含客户端相关信息的csv文件。在这两个csv文件中,除了名称和地址之外,记录的数据不同。 (这甚至没有保证,但这是一个完全不同的问题)我的任务是创建一个程序,通过这两个csv文件识别客户端的匹配,然后组合给定客户端的信息,并输出一个主csv文件与所有数据来自给定客户端的两个文件。我问的是equals方法,因为我看到解决这个问题的唯一方法是在此过程中进行大量的字符串比较。我的方法是在进入程序之前在csv上开发一个非常具体的排序,它基本上按字母顺序排列姓氏(或者我没有想出哪一个会更好的地址)然后运行二进制搜索像客户端上的算法或某种指针驱动的搜索,它将通过姓氏和地址寻找所需的客户端。在读完两个csv文件并将信息解析为客户端对象之后,这一切都将完成。在你的所有评论之后,看起来我的问题并不是关于字符串.equals()方法,而是有一种更有效的方式来比较和编译两个客户端对象,而不必遍历两个csv文件。

3 个答案:

答案 0 :(得分:1)

没有。比较字符串的最快(也是唯一合理的)方法是使用.equals()

您可能需要重新考虑您的计划,看看是否有比较大量字符串的替代方案。

答案 1 :(得分:1)

查找字符串以查找与列表中的一个或多个相等的字符串不应通过逐个比较来完成。 HashMap将快速识别一个可能相等的小子集。

重新设计客户列表的实施。添加

Map<Name,Set<Client>> last2client

和其他类似指数。

答案 2 :(得分:0)

这取决于很多因素......你从哪里获得客户名单?

从excel表格或者从文本文件?我问的原因是除非你的列表在程序中被硬编码(很不可能)从excel表单元格逐个加载名称需要花费大量的时间。无需在单个读取操作中找到将它们全部导入的方法(此处无法帮助它取决于您的工作表布局)并在整个数据集在内存中后启动字符串操作。这样循环就会有很大的进步,但是在迭代中每次初始化和分配资源以及硬盘访问都会使得这种情况永远存在,而不是等于。 只是为了论证(我不确定这一点,并希望确认或更正)我认为如果你知道如何处理它们,如果字符串非常长,如25加字,那么Byte Arrays上的操作可能比字符串更快,但是你的情况不会打扰.equals是Anubian Noob说的唯一合理的方式。

无论如何,我认为在开始比较之前对数组进行整理将有助于减少计算时间。您可以通过仅对类似.lenght()的字符串调用.equals操作来减少计算。如果它们不具有相同的长度,则它们可以相等...长度更快并且您将已经消除了至少50%的.equals操作。

所以我最后的建议是: 1)在字符串操作之前加载在内存中输入数据集 2)按字母顺序对数组进行排序 3)如果长度相等,则调用.equal,否则检查下一个字符串。

希望这无论如何都有帮助