在给定条件下如何从MutableSet中删除项目?

时间:2019-10-03 14:12:34

标签: kotlin collections

var chart_values: MutableSet<MutableMap.MutableEntry<String, Any>>? = mutableSetOf()

打印图表值

[ground={}, 
ground_level={0=115, 1=4, 2=0, 3=37, 4=63, 5=44, 6=40, 7=9}, 
ground_over={0=3, 1=3, 2=3, 3=3, 4=3, 5=3, 6=3}
date_of_birth=1988-07-18T00:00Z]

我想从 chart_values

remove ground={}

3 个答案:

答案 0 :(得分:1)

鉴于{ "cheese": [ { "Id": 2, "Description": "cheese" }, ], "spam": [ { "Id": 1, "Description": "spam" }, { "Id": 3, "Description": "spam" }, ], } 的类型为chartValues,您可以执行以下操作以删除任何以空映射作为值的条目:

MutableSet<MutableMap.MutableEntry<String, Any>>?

chartValues?.removeAll { (_, value) -> (value as? Map<*, *>)?.isEmpty() == true } 被称为安全强制转换运算符,它将返回强制转换的对象;如果强制转换失败,则返回null。

注意:

  • 使用as?
  • 可能会更好
  • 使用MutableMap<String, Any>代替val,因为您要更改集合而不是对其的引用

答案 1 :(得分:0)

顺便说一句:

  • 您的集合实际上可以是地图fn main() { let result: f64 = -10. / 0.; println!("{}", result.is_infinite()); // true println!("{}", result == std::f64::INFINITY); // false println!("{}", result == std::f64::NEG_INFINITY); // true }
  • Map<String, Any>不符合Kotlins的命名方式。使用骆驼套

由于值的类型为chart_values-如果可能,应将其更改为更具体的类型-我们必须先检查实例

Any

编辑

如果某些元素不是集合:

val chart_values: MutableSet<MutableMap.MutableEntry<String, Any>>? = mutableSetOf()
val withoutEmptyValues = chart_values.filter { (_, value) -> value is Collection<*> && value.isNotEmpty() } 

测试

我无法创建val withoutEmptyValues = chart_values.filter { (_, value) -> if(value is Collection<*>) value.isNotEmpty() else true } 的实例,所以我创建了一个内部为我做的毛绒手套

MutableMap.MutableEntry

答案 2 :(得分:0)

fun removeMapEntryIfEmpty() {
        val iterator: MutableIterator<MutableMap.MutableEntry<String, Any>> =
            player.chart_values?.iterator()!!
        iterator.forEach {
            // it: MutableMap.MutableEntry<String, Any>

            if (it.value.toString() == "{}") {
                iterator.remove()

            }
        }
    }