我有一个使用 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 后,我不会使用 Collator
,因为您无法控制如何比较字符串。您可以选择区域设置,但该区域设置如何告诉 Collator 如何比较字符串则超出了您的控制范围。
如果您知道字符串中的字符都是 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/