使用object的一个元素为自定义创建的arraylist对象重载indexof()

1tu0hz3e  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(321)

我正在尝试创建一个待办事项列表程序,但在寻找通过搜索特定项来删除元素的方法时遇到了一些问题。
我正试图实现 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";
    }

}
mwg9r5ms

mwg9r5ms1#

这里要指出的问题不少。
你已经宣布 TodoList 成为 ArrayList<Item> .
所以你的代码是:

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

总是会返回-1。列表包含 Item 不是弦。
您已经声明了一个数组来保存项名称“for indexing”。这没什么意义。遍历数组查找名称所需的时间与遍历原始列表所需的时间一样长。你会有保持索引同步的问题。
更好的选择是将项目存储在列表中并搜索具有给定名称的项目:

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

jecbmhm32#

您的代码有很多问题:您正在调用arraylist类的indexof(),您需要更改为调用自己的方法

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

    }

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

todo.getIndex("ReadBook")

也许,你是想写?

todo.getIndex("Read book")
gijlo24d

gijlo24d3#

项的所有示例都包含在todolist arraylist中。显然,您需要访问的任何内容都可以通过这个item对象列表来完成。如果您的搜索特定于item#item示例变量,则需要遍历todolist集合,并将搜索条件(readbook)与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 string的每个示例也是如此。对于搜索条件作为 "ReadBook" 即使item示例中 "Read book" . 上面的代码应该找到关系。您还将注意到,使用了string#contains()方法而不是string#indexof()方法。我认为这更适合这种特殊情况。
如果您希望搜索在所有项目示例成员变量中更具全局性,则最好将搜索条件与tostring()的项目示例进行比较,例如:

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();
}

相关问题