AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76985318
Accepted
David Frick
David Frick
Asked: 2023-08-27 08:29:11 +0800 CST2023-08-27 08:29:11 +0800 CST 2023-08-27 08:29:11 +0800 CST

Kotlin - 如何正确并行处理数据?

  • 772

我正在抓取一个网站以获取信息。片段包含两个检索数​​据然后绘制数据的方法。我必须异步处理数据以防止主线程被锁定。但是,当我运行代码时,很明显异步数据处理发生无序,这导致某些索引超出范围。我不确定该怎么办。我试图限制并行性,但没有帮助。我缺少什么?

 private fun openinsiderGetData(): DataFrame<Any> {
        val doc = Jsoup.connect("http://openinsider.com/search?q=TSLA").get()
        val table = doc.select(".tinytable")
        val dataMap =  HashMap<String, ArrayList<String>>()


        table.select("thead").select("tr").forEach {row ->
            row.getElementsByTag("th").forEach { cell ->
                dataMap[cell.text()] = ArrayList<String>()
            }
        }
        // Get the table body cells
        val keys = dataMap.keys.toList()
        Log.d("Keys", keys.toString())

        table.select("tbody").select("tr").forEach {row ->
            var index = 0
            for (i in 0..row.getElementsByTag("td").size) {
                val key = keys[index]
                Log.d("Key", key)
                index += 1
                Log.d("CELL TEXT:", row.getElementsByTag("td")[i].text())
                dataMap[key]?.add(row.getElementsByTag("td")[i].text())
                Log.d("DATA SO FAR", dataMap.toString())
            }
        }
        Log.d("Map:", dataMap.toString())

        val df = emptyDataFrame<Any>()
        for (key in dataMap.keys) {
            val column = columnOf(dataMap[key]) named key
            df.add(column)
        }
        Log.d("Dataframe:", df.toString())
 
        // process the data further
        return df
    }

}

  private fun setupData() {
        lifecycleScope.launch {
            withContext(Dispatchers.Default.limitedParallelism(1)) {
                data = openinsiderGetData()
                val rows = data.values(byRows=true)
                Log.d("ROWS:", rows.toString())
            }
// TODO - Refactor Draw the table

我的数据日志给出:

{Insider Name=[D], Filing Date=[2023-08-08 20:01:17], 1w=[2023-08-04], Ticker=[TSLA], Title=[Taneja Vaibhav], Trade Type=[CFO, CAO], ΔOwn=[S - Sale+OE], 1d=[$261.00], Owned=[-4,000], Price=[104,504], Qty=[-4%], 6m=[-$1,044,000], X=[], Value=[], Trade Date=[], 1m=[]}

这显然是不正常的。我对这种情况如何发生以及如何预防感到困惑。

kotlin
  • 2 2 个回答
  • 25 Views

2 个回答

  • Voted
  1. Best Answer
    broot
    2023-08-27T09:18:04+08:002023-08-27T09:18:04+08:00

    您的问题与并行处理数据无关。事实上,无论您是否限制并行性,您都不会在这里并行处理任何内容。您只启动了一个协程,因此没有任何东西可以并行运行。

    正如在上一个问题中一样,您似乎假设映射中的键使用某种特定的顺序,它们有自己的索引。他们一般不会。将数据添加到地图后,如果我们获取其键,我们将以随机顺序获取它们。

    解决该问题的一种方法是使用LinkedHashMap代替HashMap。这是映射的特殊实现,它保留插入顺序。更好的是,使用mutableMapOf<String, List<String>>()函数,这是在 Kotlin 中创建地图的标准方法,并且在它下面使用LinkedHashMap.

    更明确的解决方案是在解析thead. 或者我们可以将ArrayList对象同时存储在地图和列表中:

    val dataMap =  HashMap<String, ArrayList<String>>()
    val dataList =  ArrayList<ArrayList<String>>()
    
    // while parsing thead:
    val list = ArrayList<String>()
    dataMap[cell.text()] = list
    dataList += list
    
    
    // while parsing the data:
    dataList[index]?.add(row.getElementsByTag("td")[i].text())
    
    • 3
  2. Jamal N
    2023-08-27T10:12:13+08:002023-08-27T10:12:13+08:00

    问题可能出在您的HashMap,因为它不保持插入顺序,请尝试使用LinkedHashMap。

    • 0

相关问题

  • 如何在 Compose 中结合注释和样式?

  • Kotlin 收集 SharedFlow 未收集

  • 如何在 Spring Data Elasticsearch 中使用多术语过滤器?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve