動態(tài)數(shù)組

線性表

  • 具有n個相同類型元素的有限序列(n>=0)
1.png

a1是首節(jié)點 an是尾節(jié)點

常見的線性表
  • 數(shù)組
  • 鏈表
  • 隊列
  • 哈希表(散列表)

數(shù)組

  • 一種順序存儲的線性表夏志,所有元素的內(nèi)存地址都是連續(xù)得的
var array : [Int] = [11,22,33]
截屏2022-03-19 下午9.18.41.png
  • 在大多數(shù)編程語言中數(shù)組是無法動態(tài)修改的

swift實現(xiàn)一個動態(tài)數(shù)組

  • 先定義一個錯誤處理
//定義一個錯誤處理
struct arrayError:Error {
    
    enum numError:Int{
        case errorOne = -1
        case errorTwo = -2
    }
    
    let size : Int
    let kind : numError
    
    var localizedDescription : String
    {
        if kind == numError.errorOne
        {
            return "index out of boundds : the max size is\(size)"   
        }
        if kind == numError.errorTwo
        {
            return "not found"
        }
        return "other error"
    }
    
}

新建一個arrayList類 大致需要下面這些成員變量和方法

private var size : Int = 0
    //存儲任意類型Any
    private var elements : [Any]
    //默認容量
    private let common : Int = 10
    
    public init(arrayCapaticy:Int)
    {

    }
    
    public init()
    {
       
        
    }
    
    public func totalSize()->Int{
        
    }

    public func isEmpty() -> Bool {
        
    }

    public func containsEle(element : Int) -> Bool {
     
    }

    public func add(element :Any){

       
    }

    public func getElement(index:Int) throws -> Any {

    }

    public func setElement(index:Int,element:Int) throws -> Any {
   
    }

    /**
     
     指定位置增加元素
     */
    public func addElementIndex(index:Int,element:Any) throws
    {
    
    }
    
    func clearElements() {
    
    }
    
    /**
     
     打印字符串 1霎终,2耸成,3...
     */
    func toString() -> String
    {
      
    }
    
    
    private func ensureCapacity(capacity: Int)
    {
      
        
    }
  • 初始化
    //初始化一個數(shù)組容納量為arrayCapaticy 小于common取common
    public init(arrayCapaticy:Int)
    {
        let capaticy = (arrayCapaticy < common) ? common : arrayCapaticy
        elements = Array(repeating: 0, count: capaticy)
    }
    
    public init()
    {
        elements = Array(arrayLiteral: common)
    }
  • func addElementIndex指定位置添加元素
 /**
     
     指定位置增加元素
     */
    public func addElementIndex(index:Int,element:Any) throws
    {
        //允許等于size
        if index<0 || index > size {
            throw(arrayError(size: size, kind: arrayError.numError.errorOne))
        }
        //保證容量
        ensureCapacity(capacity: size + 1)
        // 1 2  3
        // 1 x  2   3
        //int 往后挪執(zhí)行的次數(shù)
//        let int : Int = size - index
//        var total : Int = size
//        for _ in 0..<int {
//            elements[total] = elements[total-1]
//            total = total - 1
//        }
        var inttest : Int = size - 1
        while inttest >= index {
            elements[inttest + 1] = elements[inttest]
            inttest = inttest - 1
        }
        //插入的值
        elements[index] = element
        size = size + 1
    }
  • 移除指定位置某個元素
    public func removeElementOfindex(index:Int) throws{
        if index<0 || index >= size {
            throw(arrayError(size: size, kind: arrayError.numError.errorOne))
        }
        // 1 2  3  4
        // 1 3  4
        var int : Int = index + 1
        while int <= size - 1 {
            elements[int - 1] = elements[int]
            int = int + 1
        }
        
        size = size - 1
        //清空最后一個元素
        var element : Any? = elements[size]
        if element is baseClass {
            element = nil
        }

    }
  • 獲取元素所在得到索引
 public func indexOfElement(elemennt:Any) -> Int {
        if size == 0 {
            return arrayError.numError.errorTwo.rawValue
        }
        var index : Int = 0
        
        if elemennt is baseClass
        {
            for _ in 0...(size - 1) {
                
                let els :baseClass = elements[index] as! baseClass
                var inEls :baseClass
                inEls = elemennt as!baseClass
                if els.string == inEls.string
                {
                    return index
                }
                index = index + 1
            }
            
        }else{
   
            for item2 in elements{
                switch item2{
                case let someInt as Int:
                    if someInt == elemennt as?Int {
                        return index
                    }
                case let someDouble as Double:
                    if someDouble == elemennt as?Double {
                        return index
                    }
                default:
                    print("1")
                }
                index = index + 1
            }
        }
        //返回-2
        return arrayError.numError.errorTwo.rawValue
    }
  • 確保容量
  private func ensureCapacity(capacity: Int)
    {
        let oldCapacity = elements.count
        if oldCapacity >= capacity {
            return
        }
        //位運算擴容至2倍
        let newCapacity = oldCapacity << 2
        var newArray : [Any]
        
        newArray = Array(repeating: 0, count: newCapacity)
        
        print("舊容量\(oldCapacity) 新容量\(newCapacity)")
        var int : Int = 0
        for _ in 0..<elements.count {
            newArray[int] = elements[int]
            int = int + 1
        }
        elements = newArray
        
    }
  • other 將數(shù)組打印成字符串
    /**
     
     打印字符串 1旱函,2,3...
     */
    func toString() -> String
    {
        if size <= 0 {
            return "no datas"
        }
        var string : String = ""
        var int : Int = 0
        for _ in 0...(size - 1) {
            if int != 0 {
                string = "\(string),"
            }
            
            let per : Any = elements[int]
            if per is baseClass {
                string = "\(string)\((per as! baseClass).toString())"
            }else{
                string = "\(string)\(per)"
            }
            int = int + 1
        }
        return string
    }
  • 清空所有元素
    func clearElements() {
        var int : Int = 0;
        for _ in 0..<elements.count {
            var object : Any? = elements[int]
            if  object is  baseClass{
                object = nil
            }
            int += 1
        }
        size = 0
    }

end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末前计,一起剝皮案震驚了整個濱河市潜秋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疾捍,老刑警劉巖奈辰,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乱豆,居然都是意外死亡奖恰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門宛裕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑟啃,“玉大人,你說我怎么就攤上這事揩尸∮加欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵岩榆,是天一觀的道長错负。 經(jīng)常有香客問我坟瓢,道長,這世上最難降的妖魔是什么犹撒? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任折联,我火速辦了婚禮,結(jié)果婚禮上识颊,老公的妹妹穿的比我還像新娘诚镰。我一直安慰自己,他們只是感情好谊囚,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布怕享。 她就那樣靜靜地躺著,像睡著了一般镰踏。 火紅的嫁衣襯著肌膚如雪函筋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天奠伪,我揣著相機與錄音跌帐,去河邊找鬼。 笑死绊率,一個胖子當著我的面吹牛谨敛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滤否,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脸狸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藐俺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欲芹,失蹤者是張志新(化名)和其女友劉穎卿啡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菱父,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颈娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浙宜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官辽。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粟瞬,靈堂內(nèi)的尸體忽然破棺而出野崇,到底是詐尸還是另有隱情,我是刑警寧澤亩钟,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布乓梨,位于F島的核電站鳖轰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扶镀。R本人自食惡果不足惜蕴侣,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臭觉。 院中可真熱鬧昆雀,春花似錦、人聲如沸蝠筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什乙。三九已至挽封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臣镣,已是汗流浹背辅愿。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忆某,地道東北人点待。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像弃舒,于是被迫代替她去往敵國和親癞埠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容