Rajkumar Singh
05/25/2021, 11:04 AMList<List<Pacs>>
from a large List<Pacs>
. I created a function buildGroupedList
that takes List<Pacs>
as argument.Rajkumar Singh
05/25/2021, 11:05 AMdata class Pacs(
val priorityCode: String,
val groupCode: String? = null
)
Rajkumar Singh
05/25/2021, 11:05 AMval lst = listOf(
Pacs("RV"),
Pacs("RF", "GRP1"),
Pacs("RID", "GRP1"),
Pacs("RI", "GRP1"),
Pacs("RID3", "GRP2"),
Pacs("RID4", "GRP2"),
Pacs("RF1"),
Pacs("RV4"),
Pacs("RI5", "GRP1"),
Pacs("RIT", "GRP2")
)
Rajkumar Singh
05/25/2021, 11:05 AMfun buildGroupedList(pacsList: List<Pacs>): List<List<Pacs>> {
val result = mutableListOf<List<Pacs>>()
var lst = mutableListOf<Pacs>()
var previousGroupCode: String? = null
for (pacs in pacsList) {
if (pacs.groupCode == null) {
if (previousGroupCode.isNullOrBlank())
continue
else {
previousGroupCode = null
lst = mutableListOf()
}
} else {
if (previousGroupCode.isNullOrBlank()) {
previousGroupCode = pacs.groupCode
lst.add(pacs)
} else {
if (pacs.groupCode == previousGroupCode) {
lst.add(pacs)
} else {
result.add(lst)
previousGroupCode = pacs.groupCode
lst = mutableListOf()
lst.add(pacs)
}
}
}
}
return result
}
Rajkumar Singh
05/25/2021, 11:07 AM[[Pacs(priorityCode=RF, groupCode=GRP1), Pacs(priorityCode=RID, groupCode=GRP1), Pacs(priorityCode=RI, groupCode=GRP1)], [Pacs(priorityCode=RI5, groupCode=GRP1)]]
Rajkumar Singh
05/25/2021, 11:10 AM[[Pacs(priorityCode=RF, groupCode=GRP1), Pacs(priorityCode=RID, groupCode=GRP1), Pacs(priorityCode=RI, groupCode=GRP1)], [Pacs(priorityCode=RID3, groupCode=GRP2), Pacs(priorityCode=RID4, groupCode=GRP2)], [Pacs(priorityCode=RI5, groupCode=GRP1)], [Pacs(priorityCode=RIT, groupCode=GRP2)]]
Rajkumar Singh
05/25/2021, 11:12 AMPacs
with null groupCode
and only contiguous Pacs
with same groupCode
must be in a same list.Rajkumar Singh
05/25/2021, 11:14 AMRajkumar Singh
05/25/2021, 11:15 AMRajkumar Singh
05/25/2021, 11:15 AMRoukanken
05/25/2021, 11:18 AMnull
group Pacs, then you just forget your built up group (pacs.groupCode == null && previousCode != null
branch) - imho this can be easily fixed with just ignoring all null groups
b) at the end of the list, you forget your built up group
if you see, GRP2 in your list fits in either of these 2 branches, so you won't get it in outputRoukanken
05/25/2021, 11:24 AM[1, null, 1]
2 choices: [[1], [1]]
or [[1, 1]]
Rajkumar Singh
05/25/2021, 11:29 AM[[1], [1]]
this would be expectationRajkumar Singh
05/25/2021, 11:30 AMfun buildGroupedList(pacsList: List<Pacs>): List<List<Pacs>> {
val result = mutableListOf<List<Pacs>>()
var lst = mutableListOf<Pacs>()
var previousGroupCode: String? = null
for (pacs in pacsList) {
if (pacs.groupCode != null) {
if (previousGroupCode.isNullOrBlank()) {
previousGroupCode = pacs.groupCode
lst.add(pacs)
} else {
if (pacs.groupCode == previousGroupCode) {
lst.add(pacs)
} else {
result.add(lst)
previousGroupCode = pacs.groupCode
lst = mutableListOf()
lst.add(pacs)
}
}
}
}
return result
}
Rajkumar Singh
05/25/2021, 11:31 AMRajkumar Singh
05/25/2021, 11:31 AM[[Pacs(priorityCode=RF, groupCode=GRP1), Pacs(priorityCode=RID, groupCode=GRP1), Pacs(priorityCode=RI, groupCode=GRP1)], [Pacs(priorityCode=RID3, groupCode=GRP2), Pacs(priorityCode=RID4, groupCode=GRP2)], [Pacs(priorityCode=RI5, groupCode=GRP1)]]
Rajkumar Singh
05/25/2021, 11:32 AMRoukanken
05/25/2021, 11:32 AMRajkumar Singh
05/25/2021, 11:42 AMRajkumar Singh
05/25/2021, 11:43 AMRajkumar Singh
05/25/2021, 11:43 AMval lst = listOf(
Pacs("RV"),
Pacs("RF", "GRP1"),
Pacs("RID", "GRP1"),
Pacs("RI", "GRP1"),
Pacs("RID3", "GRP2"),
Pacs("RID4", "GRP2"),
Pacs("RF1"),
Pacs("RV4"),
Pacs("RI5", "GRP1"),
Pacs("RIT1", "GRP2"),
Pacs("RIT2", "GRP2"),
Pacs("RIT3", "GRP2"),
Pacs("RIT4", "GRP2"),
Pacs("RIT"),
)
Rajkumar Singh
05/25/2021, 11:44 AM[[Pacs(priorityCode=RF, groupCode=GRP1), Pacs(priorityCode=RID, groupCode=GRP1), Pacs(priorityCode=RI, groupCode=GRP1)], [Pacs(priorityCode=RID3, groupCode=GRP2), Pacs(priorityCode=RID4, groupCode=GRP2)], [Pacs(priorityCode=RI5, groupCode=GRP1)]]
Roukanken
05/25/2021, 12:03 PMlst
variable
and I think I mentioned, if you want the [[1], [1]]
result in the [1, null, 1]
case, then you need to treat null
groups as proper full groups too - can't just ignore as I suggested at first, because then it would output [[1, 1]]
Roukanken
05/25/2021, 12:09 PMfun buildGroupedListSeq(pacsList: List<Pacs>): List<List<Pacs>> = sequence<List<Pacs>> {
var currentCode: String? = null // Let's start with empty <null> group
var group = mutableListOf<Pacs>()
for (pacs in pacsList) {
if (currentCode != pacs.groupCode) { // if group changes
yield(group) // produce list to output
group = mutableListOf() // set up new group
currentCode = pacs.groupCode
}
group.add(pacs) // group rn will be either empty, and so we'll add new this one
// or will be old group so we add there
}
yield(group) // also need to yield last group
}
.filterNot { it.isEmpty() } // above might have produced empty groups - at start and at end, so filter em out
.filter { it[0].groupCode != null } // filter out null groups
.toList()
it's using sequence
tho, so might not be best idea if you need it extra super duper performant. Otherwise this is probs most readable you can get itRajkumar Singh
05/25/2021, 4:52 PMRoukanken
05/25/2021, 5:25 PMnkiesel
05/25/2021, 8:22 PMRajkumar Singh
05/25/2021, 9:03 PMRajkumar Singh
05/25/2021, 9:05 PMchunked
though.nkiesel
05/25/2021, 10:43 PMnkiesel
05/25/2021, 10:51 PMnull
code): https://pl.kotl.in/d3bo_OxibRajkumar Singh
05/25/2021, 10:57 PM[Pacs(priorityCode=RIT, groupCode=GRP2)]
at the end.nkiesel
05/25/2021, 11:07 PMRajkumar Singh
05/25/2021, 11:10 PMnkiesel
05/25/2021, 11:11 PMif (currentCode != null) groupedList.add(currentList)
line just before the returnnkiesel
05/25/2021, 11:13 PMRajkumar Singh
05/25/2021, 11:17 PMnkiesel
05/25/2021, 11:23 PMnkiesel
05/25/2021, 11:34 PMif (currentCode != null)
inline conditions are nicer than filtering at the end because that defeats the whole "sequence" advantage. See https://pl.kotl.in/Q1GXBsuLQ for the resulting code. The function no longer has the groupedList
variable and when I print the results one sublist at a time, I never have to collapse the sequence in a complete list of sublists.Rajkumar Singh
05/25/2021, 11:46 PMnkiesel
05/25/2021, 11:54 PMvar currentCode = pacsList.firstOrNull()?.groupCode
if the input list can be emptynkiesel
05/25/2021, 11:55 PMNoSuchElementException
nkiesel
05/25/2021, 11:58 PMRajkumar Singh
05/26/2021, 12:03 AMRajkumar Singh
05/26/2021, 12:30 AM