Java 仅当ArrayList等于bookID时才更新它?
我已经为我的图书馆应用程序设置了一个类型为book的ArrayList。我正在尝试实现的当前功能是编辑一本书的细节。我有一个名为Java 仅当ArrayList等于bookID时才更新它?,java,arraylist,Java,Arraylist,我已经为我的图书馆应用程序设置了一个类型为book的ArrayList。我正在尝试实现的当前功能是编辑一本书的细节。我有一个名为bookID的变量,因此当我通过ArrayList调用此方法时,它将是newBook.get(index.getBookID()。有了这些信息,我想检查一下,然后做以下事情: 存在具有此ID的数组元素 使用新标题更新现有标题 我面临的问题: 循环获取ID所在的索引 更新现有标题,并将其替换为新标题 到目前为止,我的想法是: // Editing book
bookID
的变量,因此当我通过ArrayList调用此方法时,它将是newBook.get(index.getBookID()代码>。有了这些信息,我想检查一下,然后做以下事情:
- 存在具有此ID的数组元素
- 使用新标题更新现有标题
我面临的问题:
- 循环获取ID所在的索引
- 更新现有标题,并将其替换为新标题
到目前为止,我的想法是:
// Editing book in ArrayList
public void editBook(){
System.out.println("==============================");
// Ensuring array has at least one book
if(newBook.size() > 0){
// Get which part, and book the user would like to edits
System.out.print("Enter Book ID to begin editing: ");
int bookID = sc.nextInt();
System.out.println("Press 1 or 2 to edit.");
System.out.println("1: Edit title");
System.out.println("2: Edit author");
System.out.print("Enter option: ");
int editOption = sc.nextInt();
// Switch statement which will handle editing book
switch(editOption){
case 1:
// New title
System.out.print("Enter new title: ");
String newTitle = sc.nextLine();
sc.next();
// Updates title
newBook.get(position).setTitle(newTitle);
// Prints out title
System.out.println(newBook.get(position).getTitle());
break; // Edit title
上面的代码只是部分代码,下面的代码与问题无关。直接方法。。。
所有这一切都会在图书
的列表
中循环,并将用户输入的图书ID
与图书的图书ID
进行比较。如果找到匹配项,则变量bookToEdit
中会保留Book
引用
如果循环完成后,bookToEdit
为null
,则列表中没有与指定ID匹配的Book
,否则,您现在有一个需要编辑的图书的引用
// Get which part, and book the user would like to edits
System.out.print("Enter Book ID to begin editing: ");
int bookID = sc.nextInt();
sc.nextLine();
Book bookToEdit = null;
for (Book book : newBook) {
if (book.getId() == bookID) {
bookToEdit = book;
break;
}
}
if (bookToEdit != null) {
System.out.println("Press 1 or 2 to edit.");
System.out.println("1: Edit title");
System.out.println("2: Edit author");
System.out.print("Enter option: ");
int editOption = sc.nextInt();
sc.nextLine();
if (editOption == 1 || editOption == 2) {
System.out.print("New " + (editOption == 1 ? "title: " : "author: "));
String value = sc.nextLine();
switch (editOption) {
case 1:
// Update title
break;
case 2:
// Update author
break;
}
} else {
System.out.println("Invalid edit option");
}
} else {
System.out.println("Book with the id of " + bookID + " does not exist");
}
流
s
如果你想做一些更别致的事情,你可以使用
// Get which part, and book the user would like to edits
System.out.print("Enter Book ID to begin editing: ");
int bookID = sc.nextInt();
sc.nextLine();
List<Book> filtered = newBook.stream().filter((Book t) -> t.getId() == bookID).collect(Collectors.toList());
if (!filtered.isEmpty()) {
Book bookToEdit = filtered.get(0);
从概念上讲,所有这些都是在键和对象之间生成映射或关系,这使得基于提供的键查找对象更快、更简单
查看更多详细信息请使用地图解决您的问题。
您可以访问:
以下是为您提供的一些示例代码:
//init the map
Map<String, Book> dataMap = Maps.newHashMap();
//insert record
dataMap.put(bookId, book);
//update record
Optional<Book> bookOpt = Optional.ofNullable(dataMap.get(bookId));
bookOpt.ifPresent(book->{
book.setTitle(newTitle);
});
//初始化映射
Map dataMap=Maps.newHashMap();
//插入记录
dataMap.put(bookId,book);
//更新记录
Optional bookOpt=Optional.ofNullable(dataMap.get(bookId));
bookOpt.ifPresent(图书->{
书名(新标题);
});
使用映射
,键入图书ID
,或者您可以使用Java 8新的流
API和过滤器
列表
,但是使用映射
更有效int-editOption=sc.nextInt()。。。字符串newTitle=sc.nextLine()代码>->(我没有阅读您的问题,但此问题需要更正)。对不起,我不确定地图的功能。我还是一年级学生。你知道什么是树型数据结构吗?它有点类似,它允许基于唯一键更快地查找项目。您可能更熟悉的一种方法是使用int参数(intbookid)创建一个方法。如果newBook.getId()==bookId
,则可以使用for/for-each循环返回对象/索引,否则在循环完成时返回null或-1<代码>地图
,正如前面所指出的,它更有效,而且即使您还没有足够的舒适感来使用它,也绝对值得您去熟悉它。
//init the map
Map<String, Book> dataMap = Maps.newHashMap();
//insert record
dataMap.put(bookId, book);
//update record
Optional<Book> bookOpt = Optional.ofNullable(dataMap.get(bookId));
bookOpt.ifPresent(book->{
book.setTitle(newTitle);
});