当我成功对三个数组之一进行排序后,如何对其他数组进行排序

Posted

技术标签:

【中文标题】当我成功对三个数组之一进行排序后,如何对其他数组进行排序【英文标题】:How can I sort other arrays when I have successfully sorted one of the three 【发布时间】:2016-08-01 02:23:17 【问题描述】:

我希望对 ChangeArray 进行排序,使其按从高到低的顺序显示股票,我已经使用变量 sortChange 完成了此操作,但 BidArray 和 Stock Array 与新数据不对应。我该如何解决这个问题。谢谢你。

    var StockArray = [String]()
    var BidArray = [Double]()
    var ChangeArray = [Double]()




    @IBOutlet weak var tableView: UITableView!


//    @IBOutlet weak var StockSymbolLbl: UILabel!
//    @IBOutlet weak var BidSymbolLbl: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        getJSON()
        automaticallyAdjustsScrollViewInsets = false
        tableView.dataSource = self
        tableView.delegate = self
        tableView.registerNib(UINib(nibName: "StockHome", bundle: NSBundle.mainBundle()),forCellReuseIdentifier: "stockHome")
        tableView.rowHeight = 60
//        StockSymbolLbl.text = ""
//        BidSymbolLbl.text = ""


        



    func getJSON()
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) 
        let url = NSURL(string: self.stockURL)
        let request = NSURLRequest(URL: url!)
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        let task = session.dataTaskWithRequest(request)  (data, response, error) -> Void in

            if error == nil 

                let swiftyJSON = JSON(data: data!)
                let Symbol: String? = swiftyJSON["query"]["results"]["quote"][0]["symbol"].stringValue
                let bid: String? = swiftyJSON["query"]["results"]["quote"][0]["Bid"].stringValue
                let change: String? = swiftyJSON["query"]["results"]["quote"][0]["Change"].stringValue
                print(change!)
                print(Symbol!)
                print(bid!)
                dispatch_async(dispatch_get_main_queue()) 
//                self.StockSymbolLbl.text? = "\(Symbol!)"
//                self.BidSymbolLbl.text? = "\(bid!)"
                    self.NumberofRows = swiftyJSON["query"]["results"]["quote"].count

                    for i in 0...self.NumberofRows 
                        var stockcount = 0
                        stockcount += i
                        let Stock = swiftyJSON["query"]["results"]["quote"][stockcount]["symbol"].stringValue
                        let Bid = swiftyJSON["query"]["results"]["quote"][stockcount]["Bid"].doubleValue
                        let Change = swiftyJSON["query"]["results"]["quote"][stockcount]["Change"].doubleValue

                        self.StockArray.append(Stock)
                        print(Stock)
                        self.BidArray.append(Bid)
                        print(Bid)
                        self.ChangeArray.append(Change)
                        print(Change)
                    
                    self.tableView.reloadData()
                



            else
                print("There was an error")
            

        
        task.resume()
    


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return NumberofRows
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell: StockHome = tableView.dequeueReusableCellWithIdentifier("stockHome", forIndexPath: indexPath) as! StockHome

        if StockArray.count != 0
            let sortChange = ChangeArray.sort(>)
            cell.symbolLbl?.text = StockArray[indexPath.row]
            let bid = BidArray[indexPath.item]
            let changeRate = ChangeArray[indexPath.row]
            cell.bidLbl?.text = "\(bid)" + " USD "
            cell.changeLbl?.text = "\(changeRate)" + " %"

        

        print(self.StockArray)

        return cell
    
    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 
        switch ChangeArray[indexPath.row] 
        case let x where x < 0.0:
            cell.backgroundColor = UIColor(red: 255.0/255.0, green: 59.0/255.0, blue: 48.0/255.0, alpha: 1.0)
        case let x where x > 0.0:
            cell.backgroundColor = UIColor(red: 76.0/255.0, green: 217.0/255.0, blue: 100.0/255.0, alpha: 1.0)
        case let x:
            cell.backgroundColor = UIColor(red: 44.0/255.0, green: 186.0/255.0, blue: 231.0/255.0, alpha: 1.0)
        
        cell.textLabel!.textColor = UIColor.whiteColor()

        



【问题讨论】:

【参考方案1】:

目前您的三个数组是独立的,因此不保证顺序相同。

我要做的是用三个值制作 struct 并将其附加到 1 个可以排序的单个数组中。

struct Stock 
     var symbol: String = ""
     var bid: Double = 0.0
     var change: Double = 0.0

现在您可以像这样重写 getJSON() 中的 for 循环:

for i in 0..<self.NumberofRows 
    let symbol = swiftyJSON["query"]["results"]["quote"][i]["symbol"].stringValue
    let bid = swiftyJSON["query"]["results"]["quote"][i]["Bid"].doubleValue
    let change = swiftyJSON["query"]["results"]["quote"][i]["Change"].doubleValue
    let stock = Stock(symbol: symbol, bid: bid, change: change)
    stockArray.append(stock)

现在您应该可以使用以下命令对“StockArray”进行排序:

stockArray = stockArray.sort(
    return $0.change > $1.change
)

稍微偏离主题:一些提示

尽量让变量名的第一个字符不大写,Classes/Enums/Structs 的第一个字符大写。同一个变量名中的每个新词都应该大写。

其次,尝试将您的 for 循环重写为 for-each 循环。 some documentation。这更干净,不再需要NumberofRows。由于现在所有内容都在 1 个数组中,您可以在 numberOfRowsInSection 中使用 stockArray.count

您可以在调用tableView.reloadData() 之前进行排序,这样它只会排序一次,而不是每次加载单元格时。

最后,在处理可能发生变化的 JSON 时尝试使用if let,这样您就可以确定您所处理的 Double 实际上是 Double。 Some documentation

【讨论】:

当我添加 stockArray.append(Stock) 时,我得到一个错误,因为 stockArray 数组只是一个字符串,我该如何解决这个问题? var StockArray = [String]()改成var StockArray = [Stock]()

以上是关于当我成功对三个数组之一进行排序后,如何对其他数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Radixsort 对数组进行排序

按数组之一的顺序对两个数组进行排序 [Swift 3.0 - Xcode 8]

如何对特定行上的 numpy 数组进行排序,其他行相应更改? [复制]

如何在 C# 中对二维(矩形)数组进行排序?

在表格视图中显示时对数组进行排序

Vector容器 二维数组sort()排序