簡體   English   中英

按字典順序比較n個字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM