gpt4 book ai didi

java - Java 中的 g_ascii_strcasecmp 等价物

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:32:20 27 4
gpt4 key购买 nike

我有一个使用 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'ai Chi C'uan, t'other, T-, T-bone, T-bone steak, T-junction, tabasco, Tabassaran, tabby”。

最佳答案

我不会使用 Collat​​or,已经阅读了它的 Javadoc,因为您无法控制字符串的比较方式。您可以选择语言环境,但该语言环境如何告诉 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com