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