开发者

How will you sort strings in the following example?

开发者 https://www.devze.com 2022-12-23 05:39 出处:网络
so i have a开发者_开发百科 list of string {test,testertest,testing,tester,testingtest} I want to sort it in descending order .. how do u sort strings in general ? Is it based on the length or is it ch

so i have a开发者_开发百科 list of string

{test,testertest,testing,tester,testingtest}

I want to sort it in descending order .. how do u sort strings in general ? Is it based on the length or is it character by character ??

how would it be in the example above ?? I want to sort them in a descending way.


No matter what language you’re in, there’s a built-in sort function that performs a lexicographical order, which returns

['test','tester','testertest','testing','testingtest']

for your example. If I wanted this reversed, I would just say reversed(sorted(myList)) in Python and be done with it. If you look to your right you can see plenty of related questions that require a more specialized ordering method (for numbers, dates, etc.), but lexicographic order works on strings containing any kind of data.

Here’s how it works:

compare(string A, string B):
    if A and B are both non-empty:
        if A[0] == B[0]:
            // First letters are the same; compare by the rest
            return compare(A[1:], B[1:])
        else:
            // Compare the first letters by Unicode code point
            return compare(A[0], B[0])
    else:
        // They were equal till now; the shorter one shall be sorted first 
        return compare(length of A, length of B)


I would sort it like this:

testingtest
testing
testertest
tester
test


Assuming C#

string[] myStrings = {"test","testertest","testing","tester","testingtest"};
Array.Sort(myStrings);
Array.Reverse(myStrings);
foreach(string s in myStrings)
{
     Console.WriteLine(s);
}

Not always an ideal way to do it - you could implement a custom comparer instead - but for the trivial example you asked about this is probably the most logical approach.


In computer science strings are usually sorted character by character, with the preferred sort order being (for a standard english character set):

  • Null characters first
  • Followed by whitepsace
  • Followed by symbols
  • Followed by numeric characters in obvious numerical order
  • Followed by alphabetic characters in obvious alphabetical order

When sorting characters generally lowercase characters come before uppercase characters.

So for example if we were to sort / compare:

test i ng
test e r

Then "tester" would come before "testing" - the first different character in the string is the 5th one, and "e" comes before "i".

Similarily if we were to compare:

test
testing

Then in this case "test" would come first - once again the strings are identical until the 5th character, where the string "test" ends (i.e. no character) which becomes before any alphanumerical character.

Note that this can produce some counter-intutive results when dealing with numbers - for example try sorting the strings "50" and "100" - you will find that "100" comes before "50". Why? because the strings differ at character 1 and "5" comes after "1".

In nearly all languages there is a function which will do all of the above for you!

You should use that function instead of trying to sort strings yourself! For example:

// C#
string[] myStrings = {"test","testertest","testing","tester","testingtest"};
Array.Sort(myStrings);


in Java you can use natural ordering with

java.util.Collections.sort(list);

the make it descending

java.util.Collections.reverse(list);

or create your own Comparator to do the reverse sorting.


When comparing two strings to see which sorts first, the comparison is typically done on a character by character basis. If the characters in the first position (e.g., t in your example) are identical, you move to the next character. When two characters differ, that "may" define which string is considered "greater".

However, depending on the locale used and a number of other factors, it is possible for later characters in the two strings being compared to override a difference in an earlier character. For example, in some collations, the diacritics on letters are considered to be of secondary weight. So a primary difference in a later character can override the secondary difference.

When two strings are otherwise identical but one is longer, the longer one is typically considered to be "greater". When sorting in descending order, the "greater" of two strings is sorted first.


Do you want to know if test should appear after tester in a descending order? Or are you particularly interested in sorting strings with similar prefixes?

If it's the later, I'd suggest a Trie if the input tends to grow big time.

0

精彩评论

暂无评论...
验证码 换一张
取 消