按字典顺序比较n个字符串

时间:2015-12-10 06:27:39

标签: java algorithm sorting

我有一个字符串列表,我想要执行字典排序。我不能使用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)映射函数,它保留了字典顺序,然后我可以解决它。

1 个答案:

答案 0 :(得分:2)

无需实现自定义词典比较算法。您可以简单地比较字符串,以便知道其中一个字符串是否按字典顺序排列。

根据documentation

  

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;
}