繁体   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