簡體   English   中英

對字符串中的數字進行“自然”排序的最簡單方法是什么?

[英]Simplest way to do “natural” sort for numbers in strings?

我剛看到這個 ,我想知道實現這樣的自然分類的最佳方法是什么?

通常在1,4,11,12的列表中,字符串排序(在列表項中使用)返回1,11,12,4 如何實現自然排序?

在此輸入圖像描述

這些物品也可以

[ 'screen 4 episode 13', 'screen 11 episode 1', .... ]

對於上述列表和問題中提供的樣本列表,可以使用以下方法:

  1. 將元素中的數字轉換為基於桶的系統,即計算任何字符串中數字的最大值。 例如,在上面的列表中,值為2.現在轉換元素中的數字,使其長度與最大長度相同。 因此,“屏幕4集13”將被轉換為“屏幕04集13”,“屏幕11集1”將被轉換為“屏幕11集01”。

  2. 現在將修改后的列表排序為字符串。

您可以將每個字符串拆分為一系列標記。 令牌由所有非數字或所有數字組成。 然后對標記序列進行比較,而不是對字符串中的字符序列進行比較。 非數字標記比較字符串,全數字標記使用它們的整數值相互比較。

取決於全數字令牌與非數字令牌的比較,但很可能您希望foo123.txt出現在foo.txt之后但在fooA.txt之前。 這意味着當您將令牌foo與令牌foo<something> ,您不會立即僅基於這兩個令牌生成答案 - 您需要將<something>foo的令牌進行比較。

然后可以優化該基本方法,以確保您不會進行任何比嚴格必要的字符串拆分。

一種有效的解決方案是為每個要排序的字符串生成一個可以按字典順序進行比較的鍵,然后使用這些鍵對原始字符串進行排序。

要生成這些鍵,請從原始字符串的副本開始,然后轉換表示數字的子字符串,如下所示:

  • 刪除任何前導零。
  • 預先將數字子串長度編碼為數字'9'重復int(len / 9)次,然后是表示len%9的數字。

例如:

1          -> 11
10         -> 210
9          -> 19
12345678   -> 812345678
987654321  -> 90987654321    // len = 9, int(len / 9) = 1, len % 9 = 0
9876543210 -> 919876543210   // len = 10, int(len / 9) = 1, len % 9 = 1

您可能還想更換按鍵上的標點符號,以便同等地比較“Foo 123”和“Foo-123”。

Perl模塊Sort :: Key :: Natural使用這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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