Как улучшить этот дубликат объектов из метода List, используя Java 8? Объект в списке является вложенным, что делает этот комплекс сложным - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь отфильтровать дубликаты объектов из списка объектов. Я пытаюсь удалить дубликаты объектов из основного списка, переданного методу, и создать еще один список, содержащий эти дубликаты. Эта проблема становится сложной, так как Главный объект в Списке содержит объекты внутри него, с которыми нам нужно проверить дубликаты. Мое требование примерно такое, как описано ниже:

List<RateContract> "rateContractListWithOptions" contains two objects of RateContract:
[
    RateContract1 :{
      Rate :{tarifId: 1 //other variables will also be defined}
      Contract : {contractId:1}
    },
    RateContract2 :{
      Rate :{tarifId: 2}
      Contract : {contractId:1}
    }
]

Duplicate Rates will be checked using the equals method in the Rate class
At the end of the functions Processing 
"rateContractListWithOptions" this will have only one object of RateContract in list. maybe - [RateContract1 :{
      Rate :{tarifId: 1 //other variables will also be defined}
      Contract : {contractId:1}
    }]

and "duplicateRateContracts" this will contain the duplicate
[RateContract2 :{
      Rate :{tarifId: 2}
      Contract : {contractId:1}
    }]

Я написал метод filterDuplicateRatesInSameContracts, как мне это сделать? улучшить это?

    public class RateContract implements Serializable {

    private Rate rate = null;
    private Contract contract = null;
    private Map<Integer,List<Option>> optionMap = new HashMap<>();
    private Map<String, String> otherInformationMap = new HashMap<>();

    }

    public class Rate implements Serializable {

    private String promoCode = null;
    private String tiers_groupe_id = null;
    private String business_model = null;
    private Integer tarifId = null;
    private Integer ageMin = null;
    private Integer ageMinAbs = null;
    private String fuelType = null;

    @Override
    public boolean equals(Object o) {

        if (o == null || getClass() != o.getClass()) return false;
        Rate rate = (Rate) o;
        return Objects.equals(promoCode, rate.promoCode) &&
                Objects.equals(business_model, rate.business_model) &&
                !Objects.equals(tarifId, rate.tarifId) &&
                Objects.equals(ageMin, rate.ageMin) &&
                Objects.equals(ageMinAbs, rate.ageMinAbs) &&
                Objects.equals(fuelType, rate.fuelType) &&
                Objects.equals(ageMax, rate.ageMax) &&
                Objects.equals(ageMaxAbs, rate.ageMaxAbs);
    }

    @Override
    public int hashCode() {
        return Objects.hash(promoCode, business_model, tarifId, ageMin, ageMinAbs, fuelType, ageMax, ageMaxAbs);
    }
    }


    public class Contract implements Serializable {

    private Integer contractId; 
    ......
    }

    //The filtering Logic method is::

     private List<RateContract> filterDuplicateRatesInSameContracts(List<RateContract> rateContractListWithOptions) {
        Map<Integer, List<RateContract>> rateContractMap = new HashMap<>();
        rateContractListWithOptions.forEach(rateContract -> {
            rateContractMap.computeIfAbsent(rateContract.getContract().getContractId(), k -> new ArrayList<>()).add(rateContract);
        });
        List<RateContract> duplicateRateContracts = new ArrayList<>();
        rateContractMap.forEach((contract, rateContracts) -> {
            if (rateContracts.size() > 1) {
                for (RateContract rateContract : rateContracts) {
                    boolean isFound = false;
                    for (RateContract dupliRateContract : duplicateRateContracts) {
                        if (rateContract.getRate().equals(dupliRateContract.getRate())) {
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound) duplicateRateContracts.add(rateContract);
                }
            }
        });
        rateContractListWithOptions.removeAll(duplicateRateContracts);
        return duplicateRateContracts;
        }

1 Ответ

0 голосов
/ 16 мая 2019

Я интерпретирую ваш вопрос как «как переместить в отдельный список все контракты в списке, которые имеют такую ​​же частоту, как и предыдущий элемент в списке»?

Если так:

List<RateContract> duplicates = new ArrayList<>();
Set<Rate> rates = new HashSet<>();
Iterator<RateContract> iterator = contracts.iterator();
while (iterator.hasNext()) {
    RateContract contract = iterator.next();
    if (!rates.add(contract.getRate())) {
        iterator.remove();
        duplicates.add(contract);
    }
}

Обратите внимание, что здесь используется Iterator, так что вы можете удалять контракты с соответствующими ставками при перемещении по списку.Альтернативой было бы собрать их в список дубликатов, а затем удалить их.Оба будут работать.

...