【发布时间】:2021-03-30 21:34:16
【问题描述】:
我正在尝试创建一个待办事项列表程序,但在寻找通过搜索特定项目来删除元素的方法时遇到了一些麻烦。
我正在尝试实现 indexOf(),它将返回包含在 Items 的 ArrayList 中搜索的项目的元素的索引,但它只返回 -1,未找到。
我在我的 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";
}
}
【问题讨论】:
-
不要为索引使用单独的数组。只需扫描项的 ArrayList。并将参数的类型设置为 indexOf 您想要的实际类型(String),而不是 Object。否则,您的类很难使用,因为不清楚需要将什么传递给该方法。
-
而且您并没有重载 indexOf - 只有在您扩展一个类或实现一个已经定义它的接口时才会出现这种情况。
-
您将字符串传递给
TodoList.indexOf(item),但Item.equals()仅处理Items。
标签: java arraylist overloading indexof