[英]Comparing n strings lexicographically
我有一個要按字典順序排序的字符串列表。 我不允許使用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)映射函數的唯一字符串,則可以解決該問題。
無需實施您的自定義詞典比較算法。 您可以簡單地比較字符串,以了解其中一個在字典上是否最先。
根據文檔 ,
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。 如果一個字符串是另一個字符串的完整前綴,則最短的字符串應該是第一個:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.