java - java 中的 g_ascii_strcasecmp 等效项

标签 java c++ c glib

我有一个使用 g_ascii_strcasecmp 排序的单词列表功能。我需要用java处理这个列表。 java中等效的排序函数是什么?为了实现二分搜索,我需要一个正确的比较函数。到目前为止,我有下面的函数,但它并不总是产生正确的结果。

public int compareStrings(String str) {
    Collator collator = Collator.getInstance();//TODO: implement locale?
    return collator.compare(this.wordString, str);
}

更新。列表示例:“T、t、太极拳、t'other、T-、T 骨、T 骨牛排、T 字路口、塔巴斯科、塔巴萨兰、虎斑猫”。

最佳答案

在阅读了它的 Javadoc 后,我不会使用 Collat​​or,因为您无法控制如何比较字符串。您可以选择区域设置,但该区域设置如何告诉 Collat​​or 如何比较字符串则超出了您的控制范围。

如果您知道字符串中的字符都是 ASCII 字符,那么我只需使用 String.compareTo() 方法,该方法根据unicode 字符值。如果字符串中的所有字符都是 ASCII 字符,则它们的 unicode 字符值将是它们的 ASCII 值,因此按其 unicode 值按字典顺​​序排序将与按其 ASCII 值按字典顺​​序排序相同,这似乎是 g_ascii_stcasecmp 确实如此。如果您需要不区分大小写,可以使用String.compareToIgnoreCase()


正如我在评论中指出的,我认为您需要编写自己的比较函数。您需要循环遍历字符串中的字符,并跳过不在 ASCII 范围内的字符。所以像这样的东西,这是一个简单、愚蠢的实现,需要加强以涵盖我想象的 g_ascii_strcasecmp 所做的极端情况:

public int compareStrings(String str) {
    List<Character> myAsciiChars = onlyAsciiChars(this.wordString);
    List<Character> theirAsciiChars = onlyAsciiChars(str);

    if (myAsciiChars.size() > theirAsciiChars.size()) {
        return 1;
    }
    else if (myAsciiChars.size() < theirAsciiChars.size()) {
        return -1;
    }

    for (int i=0; i < myAsciiChars.size(); i++) {
        if (myAsciiChars.get(i) > theirAsciiChars.get(i)) {
            return 1;
        }
        else if (myAsciiChars.get(i) < theirAsciiChars.get(i)) {
            return -1;
        }
    }

    return 0;
}

private final static char MAX_ASCII_VALUE = 127; // (Or 255 if using extended ASCII)

private List<Character> onlyAsciiChars(String s) {
    List<Character> asciiChars = new ArrayList<>();
    for (char c : s.toCharArray()) {
        if (c <= MAX_ASCII_VALUE) {
            asciiChars.add(c);
        }
    }
    return asciiChars;
}

关于java - java 中的 g_ascii_strcasecmp 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627847/

相关文章:

c - 运行时段错误,但调试时成功

c# - 如何始终如一地读取间歇性硬盘驱动器?

java - 将所有字母字符加载到 HashMap 中的快速方法

java - TinyMCE 在保存时转义所有标签

c++ - 在 C/C++ 中使用用户定义的函数对大 vector 进行排序

java - 将具有 32 位无符号整数的哈希函数从 c++/Qt 迁移到 java

c - 简单的C题

java - 获取字节数组的 CRC 校验和并将其添加到该字节数组

java - 如何在JAVA运行时设置描边颜色?

c++ - Gtkmm - 在不关闭应用程序的情况下隐藏窗口