我有一个字符串列表,我想要执行字典排序。我不能使用Arrays.sort()
或Collections.sort()
。
这是我到目前为止的方法。
String[] testArray = new String[]{"London Arts", "Titanic", "Titan", "London", "Lean on", "Uptown Funk"};
long[] testAsciiArray = new long[testArray.length];
for(int i = 0; i < testArray.length, i++){
long asciiValue = 0;
for (char c : testArray[i].toCharArray())
asciiValue += (int)c;
testAsciiArray[i] = asciiValue;
}
然后,我计划在testAsciiArray上执行任何快速排序算法。猜测我的算法的最坏情况性能是N ^ 2,因为我循环遍历字符串的每个字符所以我也可以做冒泡排序。在我执行此方法后,是否会保证n个任意字符串的任何组合将按字典顺序排序?有没有更好的方法呢?我准备使用哈希函数,但我听说它并不能保证唯一性。
我不允许使用任何内置的Java字符串比较器,这更像是一个算法101练习。我在想,因为我知道如何对N个数组进行排序,如果我能找到一个唯一的字符串到int(或bigint)映射函数,它保留了字典顺序,然后我可以解决它。
答案 0 :(得分:2)
无需实现自定义词典比较算法。您可以简单地比较字符串,以便知道其中一个字符串是否按字典顺序排列。
compareTo(String anotherString)
按字典顺序比较两个字符串。
if (testArray[0].compareTo(testArray[1]) >= 0))
{
// testArray[0] is lexigraphically "bigger" or equal
} else {
// testArray[1] is lexigraphically "bigger"
}
现在,您只需要应用任何排序算法。
例如,冒泡排序:
boolean swapped = true;
int j = 0;
int tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < testArray.length - j; i++) {
if (testArray[i] > testArray[i + 1]) {
tmp = testArray[i];
testArray[i] = testArray[i + 1];
testArray[i + 1] = tmp;
swapped = true;
}
}
}
您可能希望使用O(N * log(N))
排序算法,如QuickSort或MergeSort,但这是另一个问题。您可以在Internet上找到大量的主题信息。
更新:由于您甚至不允许使用compareTo
,因此您可以实现自定义函数,该函数将比较字符串char by char。如果一个字符串是另一个字符串的完整前缀,那么最短的字符串应该是第一个:
int myCompareTo(String a, String b)
{
int aLength = a.length(), bLength = b.length();
int minLength = Math.min(aLength, bLength);
for (int i = 0; i < minLength; i++)
{
if (a.charAt(i) > b.charAt(i)) return 1;
if (a.charAt(i) < b.charAt(i)) return -1;
}
if (aLength > bLength) return 1;
if (aLength < bLength) return -1;
return 0;
}