使用对象的一个​​元素为自定义创建的对象 ArrayList 重载 indexOf()

Overloading indexOf() for a custom created ArrayList of objects using one element of object

我正在尝试创建一个待办事项列表程序,但我在寻找通过搜索特定项目来删除元素的方法时遇到了一些问题。

我正在尝试实现 indexOf() 这将 return 包含在 ArrayList of Items 中搜索的项目的元素的索引,但它仅 returns - 1,未找到。

我在我的 ToDo class 中重载了函数,并在我的项目 class.

中重载了 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()class,你需要改成这个调用你自己的方法

   public int getIndex(String item)
    {
        return (indexOf(item));

    }

并且这行代码不会匹配任何示例项目,因此它将 return -1

todo.getIndex("ReadBook")

也许,你打算写?

todo.getIndex("Read book")

这里有很多问题需要指出。

您已将 TodoList 声明为 ArrayList<Item>

所以你的代码:

public int getIndex(String item) {
    return (TodoList.indexOf(item));
}

总是会return-1。该列表包含 Item 而非字符串。

您已经声明了一个数组来保存项目名称'for indexing'。这没有多大意义。遍历数组查找名称所花的时间与查找原始列表所花的时间一样长。而且您将遇到保持索引同步的问题。

更好的选择是将项目存储在列表中并搜索具有给定名称的项目:

IntStream.range(0, ToDoList.size())
    .filter(i -> ToDoList.get(i).getItem().equals(item))
    .findAny().orElse(-1);

Item 的所有实例都包含在 ToDoList ArrayList 中。显然,您需要访问的任何内容都可以通过这个 Item 对象列表来完成。如果您的搜索特定于 Item#item 实例变量,那么您需要遍历 ToDoList 集合并比较 搜索条件(ReadBooks)以及 Item#item 的任何一个实例中可能包含的内容。如果检测到匹配项,则停止迭代过程并返回该迭代的当前索引。这意味着您的 getIndex() 方法需要更改:

public int getIndex(String item) {
    int index = -1;
    String itemString = item.replaceAll("\s+", "").toLowerCase();
    for (int i = 0; i < TodoList.size(); i++) {
        String listItem = TodoList.get(i).getItem().replaceAll("\s+", "").toLowerCase();
        // I think it's better to use the String#contains() method
        // instead of the String#indexOf() method.
        if (listItem.contains(itemString)) {
            index = i;
            break;
        }
    }
    return index;
}

您可能会注意到,从任何提供的搜索条件中删除了空格,并且字符串被缩减为全部小写字母。对通过迭代获取的 Item#item 字符串的每个实例执行相同的操作。这是针对搜索条件作为 "ReadBook" 提供的情况,即使项目实例显然填充了 "Read book"。上面的代码应该找到关系。您还会注意到使用了 String#contains() 方法而不是 String#indexOf() 方法。我相信这更适合这种特殊情况。

如果您希望搜索在所有 Item 实例成员变量中更加全局化,那么您最好将搜索条件与 toString() 的 Item 实例进行比较,例如:

String listItem = TodoList.get(i).toString().replaceAll("\s+", "").toLowerCase();

不过,最好将 Item#toString() 可返回字符串格式更改为可能不太详细的格式,例如:

@Override
public String toString() {
    return new StringBuilder("").append(category).append(", ")
            .append(translatePriority()).append(", ").append(item)
            .toString();
}