Сравните два списка разных типов, используя HashMap - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два класса:

public class AClass{

    String name;
    int id;
    int total;
}

public class BClass{
    String batchName;
    int id;
}

Теперь у меня есть два списка:

List<AClass> aLst;
List<BClass> bLst;

Между этими двумя списками мне нужно проверить, если AClass.id==BClass.id. Одним из способов достижения этого является наличие двух для циклов и сравнение. Но это не эффективный способ.

Другой способ - использование HashMap. Пройдите по списку BClass и используйте BClass.id в качестве ключа, а соответствующий объект в качестве значения:

Map<int,BClass> map = new HashMap<int,BClass>();
List requiredLst <BClass> = new ArrayList<BClass>();
foreach(BClass b : bLst){
    map.put(BClass.id, b);
}

foreach(AClass a : aLst){
    BClass b = map.get(a.id);
    requiredLst.add(b);
}

Это эффективный способ сравнения?

1 Ответ

0 голосов
/ 19 ноября 2018

Было бы проще с Set<Integer> хранить идентификаторы из AClass. Поскольку Set.contains() равно O (1), общая сложность будет O (n).

List<AClass> aLst = ...;
List<BClass> bLst = ...;

Set<Integer> ids = aLst.stream()
    .map(AClass::getId)
    .collect(Collectors.toSet());
List<BClass> required = bLst.stream()
    .filter(b -> ids.contains(b.getId()))
    .collect(Collectors.toList());

Однако для небольших списков стоимость создания дополнительных Set и идентификаторов бокса в Integer может перевесить преимущество сокращения числа итераций.

...