Android Kotlin 用 for next 循环替换 while

Posted

技术标签:

【中文标题】Android Kotlin 用 for next 循环替换 while【英文标题】:Android Kotlin replace while with for next loop 【发布时间】:2018-08-16 01:48:14 【问题描述】:

我们有一个 HashMap 整数/字符串,在 Java 中,我们将遍历 HashMap 并通过单击按钮一次显示 3 个键值对。下面是 Java 代码

hm.put(1, "1");
hm.put(2, "Dwight");
hm.put(3, "Lakeside");
hm.put(4, "2");
hm.put(5, "Billy");
hm.put(6, "Georgia");
hm.put(7, "3");
hm.put(8, "Sam");
hm.put(9, "Canton");
hm.put(10, "4");
hm.put(11, "Linda");
hm.put(12, "North Canton");
hm.put(13, "5");
hm.put(14, "Lisa");
hm.put(15, "Phoenix");
onNEXT(null);

public void onNEXT(View view)
    etCity.setText("");
    etName.setText("");
    etID.setText("");

    X = X + 3;

    for(int L = 1; L <= X; L++ )
        String id = hm.get(L);
        String  name = hm.get(L = L + 1);
        String  city = hm.get(L = L + 1);

        etID.setText(id);
        etName.setText(name);
        etCity.setText(city);

    

    if(X == hm.size())
        X = 0;
    

我们解码让android Studio把上面的Java代码转换成Kotlin 转换器决定将for(int L = 1; L &lt;= X; L++) 循环更改为一个while 循环,起初这似乎没问题,然后我们意识到每次单击按钮时while 循环运行了3 个循环。 Kotlin 也对这行代码抱怨了很多 String name = hm.get(L = L + 1); String city = hm.get(L = L + 1);

我们将在下面发布 Kotlin 代码并提出问题

fun onNEXT(view: View?)         
    etCity.setText("")
    etName.setText("")
    etID.setText("")

    X = X + 3

    var L = 0

    while (L <= X) 
        val id = hm[L - 2]
        val name = hm.get(L - 1)
        val city = hm.get(L)

        etID.setText(id)
        etName.setText(name)
        etCity.setText(city)

        L++
    

    if (X == hm.size) 
        X = 0
    

我们尝试编写像这样的 For Next 循环 for (L in 15 downTo 0 step 1) 看来你不能数到,所以我们认为我们将使用 hm:size 作为值 15,只使用 downTo

所以问题是

我们如何使用 Kotlin For Next Loop 语法并将 hm:size 包含在构造中? 我们将 L 声明为整数,但 Kotlin 不允许我们使用 L = L + 1 在 While 循环和 For Next 循环中 为什么? 这里是奇怪的部分通知我们可以通过使用X = X + 3来增加X YES X 在上面被声明为内部 var X = 0L 一样

【问题讨论】:

这似乎是一个非常复杂的解决方案(和问题)。关于解决方案:是否有任何理由使用 HashMap 而不是列表,每个元素代表您需要的 3 条数据?关于这个问题:你同时问很多事情。特别是,“Kotlin 不会让我们在 While 循环和 For Next 循环中使用 L = L + 1 为什么?”是什么意思?你得到什么错误? 我还鼓励您删除与问题无关的所有部分(例如它是 Android 的事实,或者 onNEXT 获得 View 作为参数。这样,​​您'会有更好的机会得到人们的回应 @marianosimone 您在所有可能的情况下都是正确的,我们将有一个由 SQLite 生成的列表。只是想测试为代码 L = L + 1 编写 For Next 循环,我们被告知参数不是表达式,并且在这种情况下只允许使用表达式 我的猜测是我们在同一行代码中混合 val 和 var 谢谢对于第二条评论建议表示赞赏 【参考方案1】:

好吧,我会咬人的。 以下代码将打印您的三元组:

val hm = HashMap<Int, String>()
hm[1] = "1"
hm[2] = "Dwight"
hm[3] = "Lakeside"
hm[4] = "2"
hm[5] = "Billy"
hm[6] = "Georgia"
hm[7] = "3"
hm[8] = "Sam"
hm[9] = "Canton"
hm[10] = "4"
hm[11] = "Linda"
hm[12] = "North Canton"
hm[13] = "5"
hm[14] = "Lisa"
hm[15] = "Phoenix"

for (i in 1..hm.size step 3) 
    println(Triple(hm[i], hm[i + 1], hm[i + 2]))

现在让我们把同样的想法转换成一个函数:

var count = 0
fun nextTriplet(hm: HashMap<Int, String>): Triple<String?, String?, String?> 
    val result = mutableListOf<String?>()
    for (i in 1..3) 
        result += hm[(count++ % hm.size) + 1]
    
    return Triple(result[0], result[1], result[2])

【讨论】:

伟大的代码行和思想非常感谢部分问题是只需要让 For Next 循环在编辑文本中显示 3 条记录,每次单击 btnNext 驯服循环是我们的议程 哇,我刚刚和你的名字建立了联系。我只在第二章。现在我如何获得并签名电子书哈哈 我花了一段时间才将我的大脑包裹在您的代码周围我对您的答案进行了编辑,因此其他人将看到如何在 EditText 字段中进行此显示我知道这个答案是正确的,只需要拥有代码到第 3 章 ha 你很高兴【参考方案2】:

我们使用了一组远非优雅的代码来完成对问题的回答。 我们使用了 CharArray,因为 Grendel 似乎对 and Array 的概念没问题

internal var YY = 0
val CharArray = arrayOf(1, "Dwight", "Lakeside",2,"Billy","Georgia",3,"Sam","Canton")

在 onCreate 方法中,我们通过调用 onCO(null) 加载了第一组数据

这是迭代使用的 CharArray 的工作代码

    fun onCO(view: View?)

    etCity.setText("")
    etName.setText("")
    etID.setText("")
    if(CharArray.size > YY)
        val id = CharArray[YY]
        val name =  CharArray[YY + 1]
        val city = CharArray[YY + 2]
        etID.setText(id.toString())
        etName.setText(name.toString())
        etCity.setText(city.toString())
        YY = YY + 3
    else
        YY = 0
        val id = CharArray[YY]
        val name =  CharArray[YY + 1]
        val city = CharArray[YY + 2]
        etID.setText(id.toString())
        etName.setText(name.toString())
        etCity.setText(city.toString())
        YY = YY + 3
    

简单但不优雅。似乎代码是比迭代更好的计数器示例。 控制 For Next Look 可能需要更少的代码行。对外观的控制似乎是错误的方向。我们可能会尝试使用关键字“何时”来将逻辑应用到这个问题的忙碌时刻

【讨论】:

【参考方案3】:

经过进一步研究,这里是我们问题的部分答案 此代码仅显示如何遍历索引此遍历的哈希映射,每 3 条记录需要添加以使代码完整。这个答案适用于任何偶然发现这个问题的人。下面提供了代码和资源链接

fun main(args: Array<String>) 
val map = hashMapOf<String, Int>()
map.put("one", 1)
map.put("two", 2)

for ((key, value) in map) 
    println("key = $key, value = $value")


该链接可让您在浏览器中试用 Kotlin 代码示例 LINK

在提出这个问题之前,我们只进行了适度的研究。我们的应用程序。如果有人重新开始使用 Kotlin,那么第二个链接可能会更有价值。我们很少在 Android 开发者页面中找到可以理解的答案。 Kotlin 和 Android 页面对初学者更友好,而且在范围上没有那么技术性。享受链接 Kotlin and Android

【讨论】:

以上是关于Android Kotlin 用 for next 循环替换 while的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin for Android使用教程(一)

使用 Kotlin for Android 进行数据绑定的问题

使用 kotlin for android app 将 pdf 文件上传到 firebase 存储

Android开发,使用的是OkHttp和Reftrofit,用的是Kotlin协程,用Kotlin写一个网络拦截器,模拟登录请求,成功后返回成功模拟数据,失败后返回错误数据

如何获取 Push.Key Firebase for Android Kotlin 中的数据 [关闭]

Kotlin 将超越 Java 成为 Android 开发的第一语言?