Как найти элементы из массива и добавить их в список (Java) - PullRequest
1 голос
/ 05 мая 2019

У меня есть три простых класса, и я хочу прочитать из Списка, чтобы узнать, сколько там книг и сколько их используется. Затем верните список всех аудиокниг, которые в данный момент не используются.

Книга:

public class Book {
    public String name;
    private String owner;
    public boolean isUsed;
}

АудиоКнига:

public class AudioBook extends Book {
    private int totalQTY;
    public int neededQTY;
}

И третий класс для управления ими:

public class Manage{
    List<AudioBook> myAudioBooks;
    Stack<Book> shelf;
    int shelfSize = 20;
}

Мой первый вопрос: как мне проверить, для каждого элемента, сколько там и сколько используется? И второй вопрос: как добавить неиспользуемые элементы в myList? Я попробовал это:

public List<Book> findNotUsedBooks(){

    //get totalQTY of each book and add them to a list
    for(int i = 0; i < myAudioBooks.size(); i++){
        List<Integer> myList = myAudioBooks.get(i).getQTY();
    }

    List<Book> myList = new ArrayList<Book>();
    for(AudioBook a : myAudioBooks){

    //this wouldn't work because getQTY() returns an int
    myList.add(a.getQTY());
    }
    return myList;
}

Извините, если вопрос недостаточно ясен, я очень плохо знаком с программированием на Java.

1 Ответ

1 голос
/ 05 мая 2019

Вы задаете 2 разных вопроса, требующих 2 разных решений:

Q1: Мой первый вопрос: как мне проверить, сколько и сколько предметов для каждого предмета?

A1: --- итерация с использованием классики для каждого цикла ---

public Integer findQTYofUsedBooks(){  // although I would suggest to go for a Long
    Integer qty = 0;
    for( Book book: myAudioBooks ) {    // forEach loop in java
      if(book.isUsed()) {
        qty += book.getQTY();    
      }
    }
    return qty;
}

A2: После того, как вы станете немного более продвинутыми, вы обнаружите несколько мощных API-подобных потоков, что делает решение еще более тривиальным:

--- Итерация с использованием потоков ---

    public Integer findQTYofUsedBooks(){  
    return myAudioBooks.stream()                   // iterate
                .filter(book -> book.isUsed())     // keep only used books
                .mapToInt(book -> book.getQTY())   // get QTY 
                .sum();                            // sum the QTY
    }

Q2: как добавить неиспользуемые элементы в myList?

A1:

public List<Book> findNotUsedBooks(){

    List<Book> notUsedBooks = new ArrayList<>();
    
    for( Book book: myAudioBooks ) {   // same trick as before just this time we add to a list of books
      if( !book.isUsed()) {
        notUsedBooks.add(book);
      }
    }
    
    return notUsedBooks;
}

A2: (с потоками)

public List<Book> findNotUsedBooks(){
    return myAudioBooks.stream()
                       .filter( book -> !book.isUsed())
                       .collect(Collectors.toList())
}
...