Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按枚举值从ArrayList中删除特定元素_Java - Fatal编程技术网

Java 按枚举值从ArrayList中删除特定元素

Java 按枚举值从ArrayList中删除特定元素,java,Java,我必须从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, "NOVE

我必须从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"));
List List=new ArrayList();
增加(新的图书项目(“标题名称1”,1950年,“小说”);
增加(新的图书项目(“标题名称2”,1970年,“恐怖”);
增加(新的图书项目(“标题名称3”,1954年,“小说”);
增加(新的图书项目(“标题名称4”,1989年,“恐怖”);
增加(新的图书项目(“标题名称5”,1990年,“幽默”);
增加(新的图书项目(“标题名称6”,1995年,“幽默”);
例如,在上述情况下,预期结果将为“滴定度1、滴定度2、滴定度5”

我尝试了以下代码来实现这一点,但没有收到预期的结果。BookGender是枚举类型

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;
}
公共列表getOldestBookPerGenre(列出图书项目){
List genreList=new ArrayList();
List returnList=new ArrayList();
对于(int i=0;i0){
genreList.sort(compareByYear);
returnList.add(genreList.get(0));
}
genreList.clear();
}
退货清单;
}

要从
数组列表中获取最早的元素,可以使用Java(
stream()
过滤器(…)
min(…)
,等等)

这并不完全是您的脚本,但您可以很容易地看到逻辑是如何工作的,因此可以将其与代码相适应

此示例搜索最古老的小说:

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;
        }
    }
}

使用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());
}

在BookItem类中,重写equals和hashcode,并为不同类型的排序实现comparable和comparatorapi@B_Osipiuk我需要在没有java8特性的情况下实现它,我认为您不需要为此重写equals和hashCode,也不需要实现Comparable;行
genreList.sort(compareByYear)
意味着compareByYear是一个比较器,因此向我们展示comparator.genreList.sort(新比较器(){@Override public int compare(BookItem BookItem,BookItem t1){Integer year1=BookItem.getReleaseDate()的代码;整数year2=t1.getReleaseDate();返回year1.compareTo(year2);});谢谢,但是我必须不使用流API@user12337268但是你在你的问题中没有注意到。。。我花了30分钟来编写和测试:(我真的很抱歉:(@user12337268但是为什么你不想使用streams?是如此清晰和有用,如果(Integer.parseInt(bookItem.getYear())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()); }
BookItem{title='TitleName2', year='1970', novel='HORROR'}
BookItem{title='TitleName1', year='1950', novel='NOVEL'}
BookItem{title='TitleName5', year='1990', novel='HUMOR'}