【问题标题】:Nested loop keeps adding the same element multiple times嵌套循环不断添加相同的元素多次
【发布时间】:2021-01-23 21:42:44
【问题描述】:

我有 2 个arrays,我得到一个string-array 和一个integer-array,如下所示:

   val country= resources.getStringArray(R.array.country_array)
   val flags = resources.getIntArray(R.array.country_flag_array)

在我的strings.xml 中如下:

<string-array name="country_array">
    <item>USA</item>
    <item>France</item>
    <item>Canada</item>

</string-array>

<integer-array name="country_flag_array">
    <item>@drawable/flag_united_states_of_america</item>
    <item>@drawable/flag_france</item>
    <item>@drawable/flag_canada</item>

</integer-array>

我有一个data class 如下添加国家标志和它的名称来填充recyclerView

data class CountryObject(val flagImage : Int, val country: String)

我有这个函数可以用国旗和国家/地区填充list

private fun addCountriesToList(country: Array<String>, flgs : IntArray) : List<CountryObject>{

        val listCountry= ArrayList<CountryObject>()

        for(c in country){
            for (f in flgs){
                listCountry.add(CountryObject(f,  c))
            }
        }

        return listCountry
    }

编辑:附加代码:

这是我保存 addCountriesToList 函数的地方

   val listCountry : List<CountryObject> = addCountriesToList(country, flags)

我有另一个填充回收站视图的函数(我知道这是可行的)

setupLanguageList(rv_country, listCountry , 0)

我可以用国家/地区名称填充recyclerView,但是每个国家/地区名称都填充了数组的大小并且图像不显示。因此,由于有 3 个国家/地区,每个国家/地区都有 3 次人口。

任何帮助或建议都将受到高度赞赏,以了解为什么这些语言显示为这样,而不是图像。

【问题讨论】:

    标签: android kotlin arraylist android-recyclerview


    【解决方案1】:

    您正在为每个国家/地区添加同一个国家/地区一次。您需要做的只是为每个国家添加匹配的索引标志

    val countryObjects = country.indexedMap { index, country ->
        CountryObject(flgs[index], country)
    }
    

    这里的 map 是一个迭代器,它接受一个参数(一个函数),其结果将构成一个列表的元素。这里的函数是使用 lambda 语法的糖,参数是当前元素的索引和元素本身。 lambda 正在返回您的 CountryObject,因为 lambda 上的最后一个声明是返回。

    所以在这种情况下,您可以这样做,因为您在字符串和整数上有一个匹配的国家/地区索引。更好的解决方案是枚举。

    enum class Country(val flagImage : Int, val country: String) {
        USA(/*the values here*/)
        //the other countries
    }
    

    那你就可以像这样直接使用枚举Country.values()

    【讨论】:

    • 非常感谢您的精彩解释。非常有帮助。我得到它来显示各个国家。关于为什么标志的图像不会设置的任何想法?可能与数据类型有关吗?
    • 我认为你在做一些无效的事情 @ 注释通常按照名称空间的指示进行解析。添加日志并查看数组中的值是什么。通常我会推送Enum 并使用R. 中的值。然后您可以使用ContextCompat 将其传递给data class 作为drawable 解决
    【解决方案2】:

    嵌套这些循环没有意义,因为您只需要每个循环中的每个元素之一。如果你嵌套它们,你得到的结果数量就会成倍增加。

    解决这个问题的方法是按索引迭代一次:

    for(i in 0 until min(country.size, flgs.size)) {
        listCountry.add(CountryObject(flgs[i], country[i]))
    }
    

    您还可以使用快捷方式:zip 函数:

    val listCountry = flgs.zip(country) { f, c -> CountryObject(f, c) }
    

    或更简洁:

    val listCountry = flgs.zip(country, ::CountryObject)
    

    【讨论】:

    • 有趣,文档中也显示了简写版本,您可以添加它kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/…
    • @cutiko 抱歉,我不确定你在指出我没有提到的内容。
    • 文档中有一个简写listA zip listB,我认为它会增加答案的价值
    • 这会给你一个配对列表,这不是 OP 想要的。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多