如何从数组中查找项目并将其添加到列表中(Java)

时间:2019-05-05 16:43:51

标签: java list arraylist

我有三个简单的类,我想从一个列表中阅读,以找出其中有多少本书,正在使用多少本书。然后返回当前未使用的所有有声读物的列表。

图书:

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 个答案:

答案 0 :(得分:1)

您要问两个不同的问题,需要两个不同的解决方案:

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())
}