Задать вопрос
@student_1

Почему код не работает?

У меня есть два листа, я хочу сравнить их с друг-другом, если один объект нет в другом листе, то ввести его.
Но мой код не работает, в чем может быть проблема?

public void compare() {
        List<PaymentRBS> testRBS = new ArrayList<>();
        PaymentRBS rbs2 = new PaymentRBS(1998, "996552140898", false);
        PaymentRBS rbs3 = new PaymentRBS(1998, "996552140898", false);
        PaymentRBS rbs4 = new PaymentRBS(1998, "996552140898", false);
        PaymentRBS rbs5 = new PaymentRBS(1997, "996552140897", false);
        testRBS.add(rbs2);
        testRBS.add(rbs3);
        testRBS.add(rbs4);
        testRBS.add(rbs5);

        List<PaymentPartner> testPartner = new ArrayList<>();
        PaymentPartner partner1 = new PaymentPartner(1998, "9965522140898", false);
        PaymentPartner partner2 = new PaymentPartner(1998, "9965522140898", false);
        PaymentPartner partner3 = new PaymentPartner(1998, "9965522140898", false);
        PaymentPartner partner4 = new PaymentPartner(1996, "9965522140896", false);
        testPartner.add(partner1);
        testPartner.add(partner2);
        testPartner.add(partner3);
        testPartner.add(partner4);

        log.info("ТРАНЗАКЦИИ КОТОРЫЕ НЕ СОВПАЛИ:");
        try {
            for (PaymentRBS rbs : testRBS) {
                for (PaymentPartner partner : testPartner) {
                    if (partner.getAccount().equals(rbs.getAccount()) && partner.getSum() == rbs.getSum()) {
                        partner.setExist(true);
                        rbs.setExist(true);
                    }
                }
            }
        } catch (OutOfMemoryError | ConcurrentModificationException exception) {
            exception.printStackTrace();
        }

        notMatchedRBS = testRBS.stream().filter(r -> !r.isExist()).collect(Collectors.toList());
        notMatchedPartner = testPartner.stream().filter(p -> !p.isExist()).collect(Collectors.toList());

        notMatchedPartner.forEach(System.out::println);
        notMatchedRBS.forEach(System.out::println);

    }


результат:
617f613b2180b363212024.png
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
xez
@xez Куратор тега Java
TL Junior Roo
Тут однозначно нельзя сказать, т.к. непонятно до конца что у вас за модели PaymentRBS и PaymentPartner.
Но, похоже, что проблема в Integer pool. Если вы сравниваете два Integer надо это делать через equals.
Вот код, иллюстрирующий проблему:
Integer a = 127;
        Integer b = 127;

        System.out.println(a == b); // true

        Integer i = 128;
        Integer j = 128;

        System.out.println(i == j);  //false
        System.out.println(i.equals(j));  //true


Если у вас Double, то там нет никакого пула, но ситуация не легче:
Double a = 1998d;
        Double b = 1998d;

        System.out.println(a == b);  // false
        System.out.println(a.equals(b)); // true


Вообще, использовать Float или Double в финансовых моделях - грубая ошибка.
Вот пара статей по этому поводу:
https://javarush.ru/groups/posts/2136-ustroystvo-v...
https://javarush.ru/groups/posts/2274-kak-ispoljhz...
Ответ написан
@Arty_Fact
Как минимум потому что 996552140898 != 9965522140898.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы