当我自己的HashMap get()方法实现中有明显的元素时,它会返回null



我有一个程序,用户可以在其中创建一个任务,并将其设置为收藏夹或非收藏夹。一旦完成,用户在输入名称时应该能够再次找到它。问题是,我的get方法在使用时返回null。

我尝试先将它存储在MapEntry,元素中,但它只会导致NullPointerException。我也尝试过只显示hashmap来获取密钥本身,但这只会导致结果为null。我的MapEntry类由私有变量组成,用于获取我的收藏夹类的密钥和值:

Favorites key;
boolean value;
MapEntries next;

其构造函数为:

public Favorites(String task, boolean bookmark) {
this.task = task;
this.bookmark = bookmark;
}

Favorites类还有以下方法:

@Override
public int hashCode(){
return (bookmark ? 0 :1);
}
@Override
public boolean equals(Object object){
Favorites temp = (Favorites) object;
return this.task.equals(temp);
}

与它的二传手和接球手并肩作战。

这是MapEntries类:

public class MapEntries{
Favorites key;
boolean value;
MapEntries entry;
public MapEntries(Favorites key, boolean value) {
this.key = key;
this.value = value;
}
public Favorites getKey() {
return key;
}
public void setKey(Favorites key) {
this.key = key;
}
public boolean isValue() {
return value;
}
public void setValue(boolean value) {
this.value = value;
}
public MapEntries getEntry() {
return entry;
}
public void setEntry(MapEntries entry) {
this.entry = entry;
}

}

在我的自定义HashMaps类中,我有我的get方法要在我的主程序中调用:

首先在类的开头创建变量:

public class HashMaps{
private static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //16
private MapEntries[] holder = new MapEntries[DEFAULT_INITIAL_CAPACITY];
public MapEntries get(Favorites key) {
if (key == null){
System.out.println("No results...");
return null;
}
int value = key.hashCode();
int holderNumber = getSupplementalHash(value);
if (holder[holderNumber] == null){
System.out.println("No results...");
return null;
}
else{
MapEntries existingElement = holder[holderNumber];
while (existingElement != null) {
System.out.println("Traversing maps for key " + existingElement.getKey());
if (existingElement.key.equals(key)) {
return existingElement;
}
existingElement = existingElement.entry;
}
}
return null;
}
//the get Supplemental Hash method:
private int getSupplementalHash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
}

我创建任务的方法:

首先在我的公共静态void主方法之外定义一个静态hashmap:

static HashMaps hashMaps = new HashMaps();
public static void forFavorites(){
int numberOfTasks = 0;
System.out.println("Enter the number of tasks you want to add: ");
numberOfTasks = Integer.parseInt(key.nextLine());
for (int taskNumber = 1; taskNumber<=numberOfTasks; taskNumber++) {
System.out.println("Task no. " + taskNumber);
System.out.println("t Enter the new task's title: ");
String newTask = key.nextLine();
String trimSpaces = newTask.trim();
if (trimSpaces.isEmpty() || newTask.length() == 0){
System.out.println("n Invalid. Title cannot be blank");
}
else {
Favorites toFavorite = new Favorites(trimSpaces, false);
System.out.println("Adding " + toFavorite.getTask());
hashMaps.put(toFavorite, false);
System.out.println("Do you want to favorite this task? Y/N");
String choice = key.nextLine();
if (choice.equalsIgnoreCase("Y")){
System.out.println();
System.out.println();
System.out.println("User chose to add "+ 
toFavorite.getTask() + " as a favorite");
Favorites favorited = new Favorites(trimSpaces, true);
hashMaps.put(favorited,true);
System.out.println("Press enter to continue..");
key.nextLine();
} else {
System.out.println("Press enter to continue..");
key.nextLine();
}
}
}
System.out.println(hashMaps.toString() + " ");
homeMenu();
}

最后是我的搜索方法

public static void search(){
System.out.println("Enter the task you want to find: ");
String lookFor = key.nextLine();
Favorites search = new Favorites(lookFor, false);
System.out.println("nNumber of tasks found: "+ hashMaps.getSize());
System.out.println(hashMaps.get(search));
System.out.println();
homeMenu();
} 

截至目前,结果是:

Enter the task you want to find: 
Task
Number of tasks found: 1
Traversing maps for key Task: false
null

让我们继续-您这样做是为了了解java的深度-否则您应该只使用HashMap。

hashmap的一个键应该就是这个键。在您的情况下,它是任务的名称。如果需要,您可以创建自己的类(收藏夹(,但它的唯一变量应该是"name"。我会把这个类命名为TaskKey,而不是Favorites。使用名为的构造函数作为参数。

哈希代码必须始终与equals匹配。这意味着,如果equals比较名称,那么hashCode必须对名称进行散列。

public int hashCode() {
return name.hashCode();
}

您可以编写自己的哈希代码,但要小心。它对哈希图中的排序和索引有着显著的影响。我建议你不要。

现在剩下的是名为"收藏夹"的布尔值。这绝对不是密钥的一部分,而是与密钥相关联的数据。也许可以创建一个名为"Task"的新类,创建它的一个实例(new(,并将其作为值。甚至可能是一个强制键成为Task一部分的构造函数。

public class Task {
private TaskKey taskKey;
private boolean favorite;
public Task(TaskKey key) {
taskKey = taskKey;
}
}
TaskKey taskKey = new TaskKey(name);
Task myTask = new Task(taskKey);
myTask.favorite = someBooleanAnswer;

在向用户询问问题并创建TaskKey和Task之后,您将把它们"放"在HashMap中。

hashMaps.put(task.taskKey, task);

稍后,您可以使用"get"方法找到任务。

Task task = hashMaps.get(task.taskKey);

进一步阅读以了解HashMap的复杂性。我也会使用getter/setter,但为了简洁起见,我省略了它们。

最新更新