2013-05-29 81 views
2

我有一個數字L1列表字符串(例如「2443」)。我有另一個這樣的列表L2。我必須將L1中的每個數字與L2中的每個數字進行比較。 L1有大約20,000個數字(許多重複)。 L2有大約600個號碼,都是獨一無二的。比較數字字符串 - 先轉換它們還是比較不轉換?

我無法獲得任何其他格式的L1和L2。

我想知道什麼是比較的最好方式 -

  1. 轉換所有的數字都長按的Long.parseLong(),然後比較?
  2. 作爲字符串比較?

哪種效率更高?我懷疑它可能幾乎是一樣的,因爲在1中,我們必須解析字符串。這是開銷。

編輯 -

我想出了一個例子。 L1是觀看泰坦尼克號(浪漫)的Netflix customer_ID列表。 L2是觀看史萊克(動畫)的customer_ID列表。如果至少70%的L1也觀看了史瑞克,那麼向他們推薦動畫電影。另外,請注意,喜歡浪漫電影的人可能也喜歡動畫電影。愚蠢的例子,但我認爲這可能是有道理的。

計算L1中元素的個數,稱之爲計數。然後,我們檢查L2中是否存在L1的元素。如果爲true,則將「找到」增加1.計算找到的/計數。如果> 70%,向浪漫愛好者推薦動畫電影。

+7

比較並做什麼? – NINCOMPOOP

+0

@TheNewIdiot - 我不確定比較背後的目的是否與這種情況有關。我想把這看成是一項任務。 – SuperStar

+3

取決於:你想要他們在數字順序,還是詞法順序? –

回答

3

爲什麼不只是代碼和檢查?

TestCode

案例1

結果0.15秒; see here

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
    String a = "1235"; 
    String b = "1235"; 

    for(int i = 0; i< 20000*600; i++){ 
     if(a.equals(b)); 
    } 
    } 
} 

殼體2

結果3.96see here

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
    String a = "1235"; 
    String b = "1235"; 

    for(int i = 0; i< 20000*600; i++){ 
     if(Long.parseLong(a) == Long.parseLong(b)); 
    } 
    } 
} 

在最壞的情況下(20000個* 600循環)進行測試。在最佳實施中,您將需要600 * log(20000)循環。

+1

哇。不知道像ideone這樣的網站。 – SuperStar

+1

我剛剛使用過..但你可以使用計時器檢查你自己的ide – stinepike

2

字符串比較按字典順序比較:see docs。這意味着根據String.compareTo設置的順序,「1000」<「8000」<「900」。

所以,如果您想要正確的數字順序,最好轉換爲整數。您可以使用Integer.parseInt(str)

2

這裏有一些缺少的信息 - 你是否需要將這些信息轉換爲數字?你只比較平等嗎?如果唯一的一點是平等比較,並且實際上並沒有將數字作爲Long,那麼您最好不要轉換爲數字:

沒有轉換爲數字,在最壞的情況下,您正在讀取每個字符串L1 * L2倍。但在平均情況下,很多這些比較將被快速追蹤,因爲字符串的大小會有所不同/不會因最後一個數字而不同。

通過轉換爲數字,您不得不讀取每一個字符串(L1 * L2倍),然後在上面添加int比較。

如果輸入字符串不能保證乾淨(可以獲得" 2""2"),這會變得更加複雜。

運行快速,軼事,運動產生與數字的字符串2個隨機列表顯示,字符串比較是明顯更快(數字以毫秒爲單位,打的是數量相等的數量):

Compare Strings: 249.0363 (hits: 600) 
Compare with Convert: 2505.3822 (hits: 600) 

這繼續在多次運行中再現。

+0

現在,只有平等很重要。我不認爲我需要將它轉換爲長時間才能使用。 – SuperStar

+0

我嘲笑了這一點,發現字符串比較確實快得多,如果平等是你所需要的。 – Oren

+0

你能告訴我如何做這樣的模擬ups嗎?它很好知道。 – SuperStar

0

從這個例子可以推斷出你是比較字符串而不是數字(一個ID可能是一個數字,但因爲你不會用它來計算,所以把它看作一個字符串是有意義的)。

因此,我認爲你應該使用字符串比較比較平等,而不是先將其轉換爲數字。這個解決方案更高效。