Kotlin — список массивов — как удалить все элементы типа T, если их меньше двух

#kotlin #collections

#kotlin #Коллекции

Вопрос:

У меня есть изменяемый список в kotlin, который выглядит следующим образом:

val бакалея = listOf( Еда («апельсин», «фрукт»), Еда («картофель», «овощ»), Еда («банан», «фрукт»), Еда («яблоко», «фрукт»), Еда («огурец», «овощ»),Еда («салат», «овощ») )

я определил закрытый класс, чтобы я мог группировать эти данные:

 sealed class RecyclerItem {
    data class Food(val name: String): RecyclerItem()
    data class Section(val title: String): RecyclerItem()
}
  

Где раздел будет содержать такие вещи, как «овощ» или «фрукт»
, а еда будет похожа на «банан» или «яблоко»
и т.д. и т.п.

чтобы сгруппировать мои данные в один список, я написал этот код с помощью groupby:

 val sectionedGroceries: List<RecyclerItem> = groceries
            .groupBy { it.category }
            .flatMap { (category, foods) ->
                listOf<RecyclerItem>(RecyclerItem.Section(category))   foods.map { RecyclerItem.Food(it.name) }
            }
  

в конце, если я распечатаю список, он будет выглядеть так:

 [Section(title=fruit), Food(name=orange), Food(name=banana), Food(name=apple),  Section(title=vegetable), Food(name=potato), Food(name=cucumber), Food(name=salad)]
  

но теперь моя проблема в том, что если в списке есть ТОЛЬКО ОДИН раздел, я хочу удалить его так, чтобы в списке была только еда. как я могу сделать это наиболее эффективно?

обновление извините, вот полный код:

     class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val groceries = listOf(
            Food("orange", "fruit"),
            Food("potato", "vegetable"),
            Food("banana", "fruit"),
            Food("apple", "fruit"),
            Food("cucumber", "vegetable"),
            Food("salad", "vegetable")
        )

            val sectionedGroceries: List<RecyclerItem> = groceries
                .groupBy { it.category }
                .flatMap { (category, foods) ->
                    listOf<RecyclerItem>(RecyclerItem.Section(category))   foods }

        Log.v("TAG","$sectionedGroceries")
    }
}


sealed class RecyclerItem {
    data class Food(val name: String, val category: String): RecyclerItem()
    data class Section(val title: String): RecyclerItem()
}
  

Комментарии:

1. Food имеет только один параметр в вашем запечатанном классе, но в списке бакалеи имеет два. И где это category определено?

2. я обновил код, поэтому теперь он очень понятен. я вставил полный код. я просто хочу удалить все классы данных раздела из конечных результатов, если есть только один раздел, потому что один раздел бессмыслен для моего использования.

Ответ №1:

 val sectionedGroceries: List<RecyclerItem> = groceries
    .groupBy { it.category }
    .let {
        if (it.size == 1) it.values.first()
        else it.flatMap { (category, foods) ->
            listOf(RecyclerItem.Section(category))   foods
        }
    }
  

Комментарии:

1. оператор let был моей проблемой, я продолжал думать, что это поток rxjava, когда его нет. его функции kotlin.. Спасибо!