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