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

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

我正在尝试创建一个待办事项列表程序,但在寻找通过搜索特定项来删除元素的方法时遇到了一些问题。
我正试图实现 indexOf() 它将返回一个元素的索引,该元素包含在项目的arraylist中搜索的项目,但它只返回-1,而不是found。
我在todo类中重载了函数,并在item类中重载了equals(object o)和hashcode()。
任何帮助都将不胜感激。

  1. import java.util.*;
  2. import java.lang.*;
  3. public class ToDo {
  4. ArrayList<Item> TodoList = new ArrayList<>();
  5. static String [] itemData = new String[100]; //to index items added to list
  6. //itemData = new String[100];
  7. static int size=0;
  8. public void addItem(String item, String category, int priority)
  9. {
  10. TodoList.add(new Item(item,category,priority));
  11. itemData[size] = item; //for indexing
  12. size++;
  13. }
  14. //remove item at specified index spot
  15. private void removeItem(int i )
  16. {
  17. TodoList.remove(i);
  18. }
  19. public void getList()
  20. {
  21. for (Item item : TodoList)
  22. {
  23. System.out.println(item.toString());
  24. }
  25. }
  26. public int getIndex(String item)
  27. {
  28. return (TodoList.indexOf(item));
  29. }
  30. public int indexOf(Object o) {
  31. if (o == null) {
  32. for (int i = 0; i < size; i++)
  33. if (itemData[i]==null)
  34. return i;
  35. } else {
  36. for (int i = 0; i < size; i++)
  37. if (o.equals(itemData[i]))
  38. return i;
  39. }
  40. return -1;
  41. }
  42. public void print() {
  43. System.out.println("To-do List: ");
  44. System.out.println("-----------");
  45. getList();
  46. if (TodoList == null) {
  47. System.out.println("You're all done for today!");
  48. }
  49. }
  50. public static void main(String[] args) {
  51. ToDo todo = new ToDo();
  52. todo.addItem("Get pickles", "Shopping", 2);
  53. todo.addItem("Read book", "School", 3);
  54. todo.addItem("Send letter", "Other", 1);
  55. todo.addItem("Buy planner", "School", 4);
  56. todo.addItem("Get potatoes", "Shopping", 3);
  57. todo.print();
  58. System.out.println("------------");
  59. //todo.removeItem("Read book","School","3");
  60. //todo.removeItem(1);
  61. System.out.println("INDEX OF READ BOOK (1) :" + todo.getIndex("ReadBook"));
  62. //todo.removeItem(todo.getIndex("ReadBook"));
  63. //todo.print();
  64. System.out.println("SIZE: " + size);
  65. }
  66. }
  1. public class Item {
  2. public int i;
  3. private String item;
  4. private String category;
  5. private int priority;
  6. //default constructor to initialize
  7. public Item(String item, String category, int priority){
  8. this.item = item;
  9. this.category = category;
  10. this.priority = priority;
  11. }
  12. public String getItem() {
  13. return item;
  14. }
  15. public void setItem(String item) {
  16. this.item = item;
  17. }
  18. public String getCategory() {
  19. return category;
  20. }
  21. public void setCategory(String category) {
  22. this.category = category;
  23. }
  24. public void setPriority(int priority) {
  25. this.priority = priority;
  26. }
  27. public int getPriority() {
  28. return priority;
  29. }
  30. //used in order to overload indexOf() method
  31. //*****************************************************
  32. @Override
  33. public boolean equals(Object o) {
  34. if (o instanceof Item) {
  35. //item comparison
  36. Item mo = (Item)o;
  37. return mo.item.equals(item);
  38. }
  39. return false;
  40. }
  41. public int hashCode() {
  42. return java.util.Objects.hashCode(item);
  43. }
  44. //*****************************************************
  45. public String translatePriority()
  46. {
  47. if (priority == 1)
  48. return "low";
  49. else if (priority == 2)
  50. return "medium";
  51. else if (priority == 3)
  52. return "high";
  53. else if (priority == 4)
  54. return "urgent";
  55. else
  56. return "invalid priority";
  57. }
  58. public String toString() {
  59. return "Category : " + category + " || Priority Level: " + translatePriority() + "\nTask : " + item + "\n";
  60. }
  61. }
mwg9r5ms

mwg9r5ms1#

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

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

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

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

jecbmhm32#

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

  1. public int getIndex(String item)
  2. {
  3. return (indexOf(item));
  4. }

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

  1. todo.getIndex("ReadBook")

也许,你是想写?

  1. todo.getIndex("Read book")
gijlo24d

gijlo24d3#

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

  1. public int getIndex(String item) {
  2. int index = -1;
  3. String itemString = item.replaceAll("\\s+", "").toLowerCase();
  4. for (int i = 0; i < TodoList.size(); i++) {
  5. String listItem = TodoList.get(i).getItem().replaceAll("\\s+", "").toLowerCase();
  6. // I think it's better to use the String#contains() method
  7. // instead of the String#indexOf() method.
  8. if (listItem.contains(itemString)) {
  9. index = i;
  10. break;
  11. }
  12. }
  13. return index;
  14. }

您可能会注意到,从任何提供的搜索条件中都会删除空格,并且字符串会缩减为所有小写字母。通过迭代获得的item#item string的每个示例也是如此。对于搜索条件作为 "ReadBook" 即使item示例中 "Read book" . 上面的代码应该找到关系。您还将注意到,使用了string#contains()方法而不是string#indexof()方法。我认为这更适合这种特殊情况。
如果您希望搜索在所有项目示例成员变量中更具全局性,则最好将搜索条件与tostring()的项目示例进行比较,例如:

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

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

  1. @Override
  2. public String toString() {
  3. return new StringBuilder("").append(category).append(", ")
  4. .append(translatePriority()).append(", ").append(item)
  5. .toString();
  6. }
展开查看全部

相关问题