2015-10-02 77 views
0

我有大量的數據採用以下形式:[四個整數數組],{與整數數組有關的字符串集}。例如,集合 - 從字典中的字符串數組中提取

[1,1,1,8],{"(1+1+1)*8"} 

[1,1,2,8],{"1*(1 + 2)*8","(1 + 2)/(1/8)"} 

我有成千上萬這些對保存在外部的文本文件,並需要能夠回憶起的關鍵的四個整數的基礎上,各條線。一種解決方案似乎是閱讀文本文件導入在啓動時一本字典,而是因爲字典

let myDict2:Dictionary<Array<Int>, Array <String>> = [[1,1,1,8]: ["(1+1+1)*8"],[1,1,2,8]: ["1*(1 + 2)*8","(1 + 2)/(1/8)"]] 

明顯的配方失敗「類型‘數組’不符合協議‘哈希的’。」

但是,我們可以從一個整數數組轉換鍵轉換成字符串,以及與此嘗試:

let myDict2:Dictionary<String, Array <String>> = ["1118": ["(1+1+1)*8"],"1128": ["1*(1 + 2)*8","(1 + 2)/(1/8)"]] 

沒有錯誤,它甚至看起來我們可以提取與

let matches2=myDict2["1128"] // correctly returns ["1*(1 + 2)*8", "(1 + 2)/(1/8)"] 
結果

但是,當我們試圖從答案拉元素具有與matches2[0],我們得到"Cannot subscript a value of type '[String]?'"

在我的鍵盤敲打隨機,我得到了這窩k與matches2![0]但我不知道爲什麼。

  1. 有沒有辦法讓我的原始字典嘗試[整數,字符串集]工作?
  2. 在第二個公式[字符串,字符串集合]中,爲什麼matches2![0]工作和matches2[0]不是?
  3. 字典是一個合理的方法嗎?還是有其他一些數據結構可以更好地實現我的目標?

回答

1

我先回答你的第二個問題:

let matches2=myDict2["1128"] // returns an Optional<Array<String>> 

dict[key]調用將返回一個可選的值,因爲字典可能不包含該鍵。所以,你必須解開它首先

matches2[0] // error 
matches2![0] // ok 

現在到你的其他問題:一Dictionary適合的情況下,當你必須根據一鍵保持數據的唯一性。例如,如果每個人都需要一個唯一的社會安全號碼,則應將SSN用作字典密鑰,將人員信息用作其值。我不知道你的要求是什麼,所以我會把它留在通用的。

將這四個數字連接成一個字符串是一個壞主意,除非所有數字都具有相同的數字位數。例如,(1,23,4,5)(12,3,4,5)將產生相同的字符串。

Array<Int>沒有實現Hashable協議,所以你必須提供你自己的包裝。這是我的嘗試:

struct RowID : Hashable { 
    var int1: Int 
    var int2: Int 
    var int3: Int 
    var int4: Int 

    init(_ int1: Int, _ int2: Int, _ int3: Int, _ int4: Int) { 
     self.int1 = int1 
     self.int2 = int2 
     self.int3 = int3 
     self.int4 = int4 
    } 

    var hashValue : Int { 
     get { 
      return "\(int1),\(int2),\(int3),\(int4)".hashValue 
     } 
    } 
} 

// Hashable also requires you to implement Equatable 
func ==(lhs: RowID, rhs: RowID) -> Bool { 
    return lhs.int1 == rhs.int1 
      && lhs.int2 == rhs.int2 
      && lhs.int3 == rhs.int3 
      && lhs.int4 == rhs.int4 
} 

let myDict: [RowID: [String]] = [ 
    RowID(1,1,1,8): ["(1+1+1)*8"], 
    RowID(1,1,2,8): ["1*(1 + 2)*8","(1 + 2)/(1/8)"] 
] 

let id = RowID(1,1,2,8) 
let value = myDict[id]![0] 

// You can also access it directly 
let value2 = myDict[RowID(1,1,1,8]]![0] 
+0

由於整數數組的限制,我知道如果轉換爲字符串形式沒有不明確的條目。但是,您的Hashable和Equatable的示例實現在將來肯定會派上用場。謝謝。 –