Присоединиться к двум спискам и изменить конкретные данные - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть следующие два списка, и мне нужно присоединиться к нему таким образом, чтобы у каждого Лица были все Книги и данные об изменениях во время объединения:

Примечание: Как это сделатьработа за рамками for() loop?

List<Person> personList = new ArrayList<>()
personList.add(new Person("John", "Dou"))
personList.add(new Person("Ben", "Gun"))
personList.add(new Person("Andre", "McDonald"))


List<Books> booksList = new ArrayList<>()
booksList.add(new Book("Harry Potter part_1", true)
booksList.add(new Book("Harry Potter part_2",  true)
booksList.add(new Book("Harry Potter part_3",  true)
booksList.add(new Book("Harry Potter part_4",  true)
booksList.add(new Book("Harry Potter part_5",  false)

Условия:

Потребность в "Джоне Доу": все книги true

А для другого человека только 3 Книги составляют true

Также есть класс Marker, который содержит как Песон как Книги:

new Marker( new Person, new Book, int )

Вотмой код, но не понимаюОн меняется следующим образом:

List<Marker> joinList = new ArrayList<>()

for(int i = 0; i<personList.size(); i++) {

    for(int k = 0; k<booksList.size(); k++) {

        If(personList.get(i).getName().equals("John") {

            booksList.get(k).setReading(true);

        } else {

              if(k < 3 && !personList.get(i).getName().equals("John")){

                  booksList.get(k).setReading(true);

              } else {

                     booksList.get(k).setReading(false)
                 }
          }

    joinList.add(new Marker(personList.get(i), booksList.get(k), k))

    }
}

Он должен работать за рамками for() цикл

joinList.forEach( (x) -> 
System.out.println(x.getPerson.getName() + " " + 
                   x.getBook().getName()+" "+
                   x.getBook().getReading() ))

Но он делает только 3 книги true

Текущий результат:

Выход

John Dou : Harry Potter part_1", true
John Dou : Harry Potter part_2", true
John Dou : Harry Potter part_3", true
John Dou : Harry Potter part_4", false
John Dou : Harry Potter part_5", false


Ben Gun : "Harry Potter part_1", true
Ben Gun : "Harry Potter part_2", true
Ben Gun : "Harry Potter part_3", true
Ben Gun : "Harry Potter part_4", false
Ben Gun : "Harry Potter part_5", false


Andre McDonald : "Harry Potter part_1", true
Andre McDonald : "Harry Potter part_2", true
Andre McDonald : "Harry Potter part_3", true
Andre McDonald : "Harry Potter part_4", false
Andre McDonald : "Harry Potter part_5", false

==== Ожидаемый результат:====

Выход

John Dou : Harry Potter part_1", true
John Dou : Harry Potter part_2", true
John Dou : Harry Potter part_3", true
John Dou : Harry Potter part_4", true
John Dou : Harry Potter part_5", true


Ben Gun : "Harry Potter part_1", true
Ben Gun : "Harry Potter part_2", true
Ben Gun : "Harry Potter part_3", true
Ben Gun : "Harry Potter part_4", false
Ben Gun : "Harry Potter part_5", false


Andre McDonald : "Harry Potter part_1", true
Andre McDonald : "Harry Potter part_2", true
Andre McDonald : "Harry Potter part_3", true
Andre McDonald : "Harry Potter part_4", false
Andre McDonald : "Harry Potter part_5", false

В будущем я буду использовать joinList в stream().Collectors, чтобы получить следующий результат:

John Dou :       "Harry Potter part_1", "Harry Potter part_2", "Harry Potter part_3", "Harry Potter part_4", "Harry Potter part_5"
Ben Gun :        "Harry Potter part_1", "Harry Potter part_2", "Harry Potter part_3"
Andre McDonald : "Harry Potter part_1", "Harry Potter part_2", "Harry Potter part_3"

1 Ответ

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

Единственный способ сделать эту работу с учетом текущих требований и дизайна класса - предоставить каждому человеку свои копии книг.

На основе текущего кода

List<Marker> joinList = new ArrayList<>()

for(int i = 0; i<personList.size(); i++) {
    Person person = personList.get(i);
    for(int k = 0; k<booksList.size(); k++) {
        Book book = booksList.get(k);
        Book bookCopy = new Book();
        bookCopy.setName(book.getName);
        if(person.getName().equals("John" || k < 3) {                
            bookCopy.setReading(true);
        } else {
            bookCopy.setReading(false);
        }
        joinList.add(new Marker(person, bookCopy, k)); 
    }
}
...