繁体   English   中英

通过枚举值从 ArrayList 中删除特定元素

[英]Removing specific elements from ArrayList by enum value

我必须从 ArrayList 中删除元素,但我无法使其工作。 我必须为每种类型收集最古老的书名。

List<BookItem> list = new ArrayList<>();
list.add(new BookItem("TitleName1", 1950, "NOVEL"));
list.add(new BookItem("TitleName2", 1970, "HORROR"));
list.add(new BookItem("TitleName3", 1954, "NOVEL"));
list.add(new BookItem("TitleName4", 1989, "HORROR"));
list.add(new BookItem("TitleName5", 1990, "HUMOR"));
list.add(new BookItem("TitleName6", 1995, "HUMOR"));

例如,在上述情况下,所需的结果将是“TitleName1,TitleName2,TitleName5”。

我尝试了下面的代码来实现这一点,但我没有收到想要的结果。 BookGenre 是枚举类型。

public List<BookItem> getOldestBookPerGenre(List<BookItem> bookItems){
    List<BookItem> genreList = new ArrayList<>();
    List<BookItem> returnList = new ArrayList<>();
    for(int i=0; i < BookGenre.values().length; i++){
        for(BookItem item: bookItems) {
            if (item.getBookGenre().ordinal() == i) {
                genreList.add(item);
            }
        }
        if (genreList.size() > 0) {
            genreList.sort(compareByYear);
            returnList.add(genreList.get(0));
        }
        genreList.clear();
    }
    return returnList;
}

要从ArrayList中获取最旧的元素,您可以使用 Java stream()filter(...)min(...)等)。

它不完全是你的脚本,但你可以很容易地看到逻辑是如何工作的,因此可以用你的代码来调整它。

此示例搜索最古老的 NOVEL 书籍:

import java.util.*;
import java.util.Arrays;
import java.util.List;

public class test
{
    public static void main(String[] args)
    {
        List<BookItem> list = new ArrayList<>();
        list.add(new BookItem("TitleName1", 1950, "NOVEL"));
        list.add(new BookItem("TitleName2", 1970, "HORROR"));
        list.add(new BookItem("TitleName3", 1954, "NOVEL"));
        list.add(new BookItem("TitleName4", 1989, "HORROR"));
        list.add(new BookItem("TitleName5", 1990, "HUMOR"));
        list.add(new BookItem("TitleName6", 1995, "HUMOR"));

        BookItem oldestNovel = list.stream()
            .filter(element -> element.genre.equals("NOVEL"))
            .min((el1, el2) -> { if(el1.year == el2.year) return 0; return el1.year < el2.year ? -1 : 1; })
            .get();

        System.out.println(oldestNovel.title);
    }

    static class BookItem
    {
        String title = "";
        int year = 0;
        String genre = "";
        public BookItem(String title, int year, String genre)
        {
            this.title = title;
            this.year  = year;  
            this.genre = genre;
        }
    }
}

Output:

TitleName1

使用 java stream 很容易,但正如您所说,您不能在这里使用 Java8,您还有另一种解决方案:

public List<BookItem> getOldestBookPerGenre(List<BookItem> bookItems) {
    Map<String, BookItem> oldestBookByGenre = new HashMap<>();

    for (BookItem bookItem : bookItems) {
        oldestBookByGenre.putIfAbsent(bookItem.getGenre(), bookItem);
        if (Integer.parseInt(bookItem.getYear()) < Integer.parseInt(oldestBookByGenre.get(bookItem.getGenre()).getYear())) {
            oldestBookByGenre.put(bookItem.getGenre(), bookItem);
        }
    }

    return new ArrayList<>(oldestBookByGenre.values());
}

Output 列表,给定问题输入:

BookItem{title='TitleName2', year='1970', novel='HORROR'}
BookItem{title='TitleName1', year='1950', novel='NOVEL'}
BookItem{title='TitleName5', year='1990', novel='HUMOR'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM