我正在尝试创建一个待办事项列表程序,但在寻找通过搜索特定项来删除元素的方法时遇到了一些问题。
我正试图实现 indexOf()
它将返回一个元素的索引,该元素包含在项目的arraylist中搜索的项目,但它只返回-1,而不是found。
我在todo类中重载了函数,并在item类中重载了equals(object o)和hashcode()。
任何帮助都将不胜感激。
import java.util.*;
import java.lang.*;
public class ToDo {
ArrayList<Item> TodoList = new ArrayList<>();
static String [] itemData = new String[100]; //to index items added to list
//itemData = new String[100];
static int size=0;
public void addItem(String item, String category, int priority)
{
TodoList.add(new Item(item,category,priority));
itemData[size] = item; //for indexing
size++;
}
//remove item at specified index spot
private void removeItem(int i )
{
TodoList.remove(i);
}
public void getList()
{
for (Item item : TodoList)
{
System.out.println(item.toString());
}
}
public int getIndex(String item)
{
return (TodoList.indexOf(item));
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (itemData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(itemData[i]))
return i;
}
return -1;
}
public void print() {
System.out.println("To-do List: ");
System.out.println("-----------");
getList();
if (TodoList == null) {
System.out.println("You're all done for today!");
}
}
public static void main(String[] args) {
ToDo todo = new ToDo();
todo.addItem("Get pickles", "Shopping", 2);
todo.addItem("Read book", "School", 3);
todo.addItem("Send letter", "Other", 1);
todo.addItem("Buy planner", "School", 4);
todo.addItem("Get potatoes", "Shopping", 3);
todo.print();
System.out.println("------------");
//todo.removeItem("Read book","School","3");
//todo.removeItem(1);
System.out.println("INDEX OF READ BOOK (1) :" + todo.getIndex("ReadBook"));
//todo.removeItem(todo.getIndex("ReadBook"));
//todo.print();
System.out.println("SIZE: " + size);
}
}
public class Item {
public int i;
private String item;
private String category;
private int priority;
//default constructor to initialize
public Item(String item, String category, int priority){
this.item = item;
this.category = category;
this.priority = priority;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public void setPriority(int priority) {
this.priority = priority;
}
public int getPriority() {
return priority;
}
//used in order to overload indexOf() method
//*****************************************************
@Override
public boolean equals(Object o) {
if (o instanceof Item) {
//item comparison
Item mo = (Item)o;
return mo.item.equals(item);
}
return false;
}
public int hashCode() {
return java.util.Objects.hashCode(item);
}
//*****************************************************
public String translatePriority()
{
if (priority == 1)
return "low";
else if (priority == 2)
return "medium";
else if (priority == 3)
return "high";
else if (priority == 4)
return "urgent";
else
return "invalid priority";
}
public String toString() {
return "Category : " + category + " || Priority Level: " + translatePriority() + "\nTask : " + item + "\n";
}
}
3条答案
按热度按时间mwg9r5ms1#
这里要指出的问题不少。
你已经宣布
TodoList
成为ArrayList<Item>
.所以你的代码是:
总是会返回-1。列表包含
Item
不是弦。您已经声明了一个数组来保存项名称“for indexing”。这没什么意义。遍历数组查找名称所需的时间与遍历原始列表所需的时间一样长。你会有保持索引同步的问题。
更好的选择是将项目存储在列表中并搜索具有给定名称的项目:
jecbmhm32#
您的代码有很多问题:您正在调用arraylist类的indexof(),您需要更改为调用自己的方法
并且这行代码将不匹配任何示例项,因此它将返回-1
也许,你是想写?
gijlo24d3#
项的所有示例都包含在todolist arraylist中。显然,您需要访问的任何内容都可以通过这个item对象列表来完成。如果您的搜索特定于item#item示例变量,则需要遍历todolist集合,并将搜索条件(readbook)与item#item的任何一个示例中可能包含的内容进行比较。如果检测到匹配,则迭代过程将停止,并返回该迭代的当前索引。这意味着您的getindex()方法需要更改:
您可能会注意到,从任何提供的搜索条件中都会删除空格,并且字符串会缩减为所有小写字母。通过迭代获得的item#item string的每个示例也是如此。对于搜索条件作为
"ReadBook"
即使item示例中"Read book"
. 上面的代码应该找到关系。您还将注意到,使用了string#contains()方法而不是string#indexof()方法。我认为这更适合这种特殊情况。如果您希望搜索在所有项目示例成员变量中更具全局性,则最好将搜索条件与tostring()的项目示例进行比较,例如:
不过,最好将item#tostring()可返回的字符串格式更改为不太详细的格式,如: