Как сравнить два объекта списка в Java? - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу код сканирования всей информации с сайта.Я хочу, чтобы при фильтрации и сохранении в базе данных данные, которые я фильтрую, не содержали базу данных.Если содержит базу данных, я не хочу ее сохранять («потому что она дублируется»).Я пишу код ниже:

@Data
@Entity
public class PostFeedItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "link_profile")
    private String linkProfile;
    @Column(name = "link_image")
    private String linkImage;
    @Column(name = "full_name")
    private String fullName;
    @Column(name = "content_title")
    private String contentTitle;
    @Column(name = "time_published")
    private String timePublished;
    @Column(name = "number_view")
    private String numberView;
    @Column(name = "number_comment")
    private String numberComment;
    @Column(name = "number_clip")
    private String numberClip;
    @Column(name = "point")
    private String points;
    @ElementCollection
    @CollectionTable(name = "tags", joinColumns = @JoinColumn(name = "tag_id"))
    @Column(name = "tags_post")
    private List<String> tags = new ArrayList<>();
}

Теперь я получаю все данные из базы данных методом:

public Iterable<PostFeedItem> findAllPostFeedItemInDatabase() {
        return postFeedItemRepository.findAll();
    }

У меня есть список listPostFieldItems, и я хочу сравнить с postFeedItemInDatabase.Если какой-либо элемент из listPostFieldItems совпадает с какими-либо элементами postFeedItemInDatabase, я не хочу его сохранять.Если не совпадают, я сохраняю это.Я пишу код ниже:

    List<PostFeedItem> postFeedItemInDatabase = (List<PostFeedItem>) findAllPostFeedItemInDatabase();
    if(!postFeedItemInDatabase.isEmpty()) {
        for (int i = 0; i < listPostFieldItems.size(); i++) {
            for (int j = i+1; j < postFeedItemInDatabase.size(); j++) {
                if((listPostFieldItems.get(i).getContentTitle().equals(postFeedItemInDatabase.get(j).getContentTitle()))) {
                    postFeedItemRepository.save(listPostFieldItems.get(i));
                }
            }
        }
    } else  {
        listPostFieldItems.forEach(postFeedItem -> {
           postFeedItemRepository.save(postFeedItem);
       });
    }

Но это не сработало.У меня вопрос.Как сравнить List<PostFeedItem> listPostFieldItems с List<PostFeedItem> listItemFromDatabase и сохранить все объекты из listPostFieldItems, если какой-либо элемент из listPostFieldItems не соответствует listPostFieldItems.

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

return (list1.size () == list2.size ()) && list1.containsAll (list2);нужен метод для сравнения объекта в списке.

0 голосов
/ 21 декабря 2018

Ваш код неправильный, так как он должен использовать индекс j, и вы должны построить цикл по-другому, здесь у вас есть совпадение, поэтому существующая запись в БД, которую вы сохраняете, вам нужна противоположная.

Есть более простые способы, для обоих я бы предложил сначала сохранить список contentTitle, так как это ключ для поиска совпадения / несоответствия

List<String> allTitles = postFeedItemInDatabase.stream().map(PostFeedItem::getContentTitle).collect(Collectors.toList());

Тогда вы можете

  1. Удалите те, которые соответствуют: из первого списка, который в качестве их заголовка в списке заголовков БД

    listPostFieldItems.removeIf(elt -> allTitles.contains(elt.contentTitle));
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  2. Или, оставьте те, которыене соответствует

    listPostFieldItems = listPostFieldItems.stream().filter(elt -> !allTitles.contains(elt.contentTitle)).collect(Collectors.toList());
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  3. Конкат операций

    listPostFieldItems.stream()
                      .filter(elt -> !allTitles.contains(elt.contentTitle))
                      .forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
0 голосов
/ 21 декабря 2018

Я думаю, что у вашего исходного кода есть 2 проблемы

  1. Для цикла postFeedItemInDatabase должен начинаться с 0 вместо i + 1.

  2. Если условие listPostFieldItems.get(i).getContentTitle().equals(postFeedItemInDatabase.get(i).getContentTitle()) выглядит странно.

    • Состояние not equals.Если элементы в listPostFieldItems не равны элементам в postFeedItemInDatabase -> save ().
    • postFeedItemInDatabase.get(j) вместо postFeedItemInDatabase.get(i)
0 голосов
/ 21 декабря 2018

1) Преобразуйте ваш список в java.util.concurrent.CopyOnWriteArrayList;2) Итератор вашего списка;3) Добавьте объект в свой список, если какой-либо элемент не соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...