#java #android #kotlin
#java #Android #kotlin
Вопрос:
У меня есть 2 списка данных:
data class PatientData(var patientID: String, var patientName:String, var patientPhone:String)
var list1: List<PatientData>?=null
var list2: List<PatientData>?=null
Мне нужно определить, является ли list1 дубликатом list2. Одним из способов определения этого является сопоставление с идентификатором пациента.
Я пробовал разные способы, такие как zip и contentEquals, но это не сработало.
Комментарии:
1. Когда бы вы рассмотрели дубликаты списков? Должен ли порядок списков быть одинаковым?
2.
if (list1.size == list2.size amp;amp; list1.containsAll(list2) amp;amp; list2.containsAll(list1)) true else false
🙂3. Для этого решения (или, вероятно, любого) вам нужно убедиться
equals()
,hashcode()
что оно реализовано правильно.4. можете ли вы сказать мне, как реализовать equals и hashcode?
5. Если подумать, «класс данных» делает это автоматически, я думаю, так что с этим у вас, вероятно, все в порядке. Тогда решение из предыдущего комментария, вероятно, должно сработать. Несмотря
if
на то, что -часть может быть опущена. Выражения в круглых скобках должно быть достаточно.
Ответ №1:
Ваш класс данных выполняет большую часть работы по сравнению для вас из коробки, так что это всего лишь случай выполнения некоторых сравнений коллекций.
Как говорит Анимеш, вы можете выполнить проверку размера и containsAll
(если вы знаете, что они одинакового размера, вам нужно выполнить containsAll
проверку только одним способом)
if (list1.size == list2.size amp;amp; list1.containsAll(list2))
Вы можете отсортировать списки, а затем напрямую сравнить их (поскольку ваши классы не реализуют Comparable
, нам придется делать это самим, patientId
это хороший выбор, предполагающий, что это уникальное значение)
if (list1.sortedBy { it.patientID } == list2.sortedBy { patientID })
Или вы действительно можете использовать a Set
для этого, если вам все равно не нужны повторяющиеся PatientData
объекты — это позволит вам создавать хорошие свойства набора, такие как объединения и пересечения, но для целей сравнения два набора равны, если они содержат одну и ту же коллекцию элементов
if (set1 == set2)