【问题标题】:Searching/sorting and string encoding in JavaJava中的搜索/排序和字符串编码
【发布时间】:2014-09-25 09:05:59
【问题描述】:

我正在为一个项目用 Java 构建一个小的内存文件系统,我目前正在使用二进制搜索来定位节点,但是当我在寻找错误时,我注意到带有大写字母的节点将被排序到开头因为它们在 Unicode 中的位置而被列在列表中。这仍然适用于使用二进制搜索查找节点,但是虽然它们应该表示按字母排序的列表,但这是不可接受的,例如:

Hosts.txt abc home settings.txt

我认为最简单的解决方案(理论上)是将字符串放在一个字符集中,其中的字符布局如下:

aAbBcCdDeEfFgGhHiIjJkKlLmM... and so on with special characters and such included

有什么方法可以轻松做到这一点,或者有更好的方法吗?

【问题讨论】:

  • 如何对字符串进行排序?
  • 我使用二分搜索来查找要插入列表的位置。然而,这是问题的一部分,因为 'A' 和 'a' 之间的区别是整个字母表,使用 Unicode 字符串的二进制搜索无法按要求对列表进行排序
  • 一些代码肯定会有所帮助,但您可能应该将二进制搜索中的字符串比较为不区分大小写
  • 我看不出任何代码会有什么帮助。但是在二进制搜索中使用不区分大小写的比较会使“Hosts.txt”和“hosts.txt”相等,这是我的重点。
  • 是的,但是您可以决定在不区分大小写的比较中两个字符串相等时该怎么做。 .

标签: java sorting search character-encoding


【解决方案1】:

您应该定义自己的比较器:

public class MyStringComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {

        int caseIgnoreResult = s1.compareToIgnoreCase(s2);
        if (caseIgnoreResult == 0) {
            return s1.compareTo(s2);
        }
        else {
            return caseIgnoreResult;
        }
    }
}

我希望这会有所帮助。

【讨论】:

  • 但我需要它区分大小写,否则“aB”和“Ab”会被认为是相同的,这会破坏我的二分搜索。
  • 如果 compareToIgnoreCase 返回 0(忽略大小写考虑,字符串相等),使用 compareTo() 再次测试相等性。
  • @Linuxxon 我已经编辑了我的答案,希望这是你真正想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2016-12-20
相关资源
最近更新 更多