【问题标题】:Overloading indexOf() for a custom created ArrayList of objects using one element of object使用对象的一个​​元素为自定义创建的对象数组列表重载 indexOf()
【发布时间】: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


【解决方案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();
}

【讨论】:

    【解决方案2】:

    您的代码存在许多问题: 您正在调用 ArrayList 类的 indexOf() ,您需要更改为 this 以调用您自己的方法

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

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

    todo.getIndex("ReadBook")
    

    也许,你的意思是写作?

    todo.getIndex("Read book")
    

    【讨论】:

      【解决方案3】:

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

      您已将TodoList 声明为ArrayList&lt;Item&gt;

      所以你的代码:

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

      总是会返回 -1。该列表包含Items 而不是字符串。

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-07
        • 2019-10-26
        • 2021-12-19
        • 1970-01-01
        • 2022-12-07
        • 2020-07-21
        • 2014-06-20
        • 2017-05-31
        • 1970-01-01
        相关资源
        最近更新 更多