Создание вашего собственного набора ключей для пользовательского класса HashMap - PullRequest
0 голосов
/ 29 октября 2019

Я создаю программу, в которой пользователь может создать выбранное количество задач, добавить к ним заголовок и указать, будет ли он избранным или нет.

Я установил свой ключ к классу под названием «Избранное» и статус «Избранное» или как логическое значение для значения:

public class Favorites {

private String task; //Title of bookmarked task
private boolean bookmark; //either favorite or otherwise

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

public String getTask() {
    return task;
}

public void setTask(String task) {
    this.task = task;
}

public boolean isBookmark() {
    return bookmark;
}

public void setBookmark(boolean bookmark) {
    this.bookmark = bookmark;
}

@Override
public int hashCode(){
    return (bookmark ? 0 :1);
}

@Override
public boolean equals(Object object){
    Favorites temp = (Favorites) object;
    return this.task.equals(temp);
}

@Override
public String toString(){
    return getTask() + ": " + bookmark;
}

public void display(){
    try{
        if (!isBookmark()){
            System.out.println("Non-Favorite: " + getTask());
        }
        else {
            System.out.println("Favorite: "+ getTask());
        }
    } catch (Exception e){
        System.out.println("Nothing to display");
    }
}
}

Я реализовал класс «Избранное» для моего HashMapследующий класс:

public class HashMaps{
private static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //16
private MapEntries[] holder = new MapEntries[DEFAULT_INITIAL_CAPACITY];

private int getSupplementalHash(int h) {
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

public int getSize (){
    int counter = 0;
    for (int index = 0; index <holder.length; index++){
        if (holder[index] != null){
            int secondCounter = 0;
            for (MapEntries entry = holder[index]; entry.entry != null; entry = entry.entry){
                secondCounter++;
            }
            counter += secondCounter;
            counter++;
        }
    }
    return counter;
}



private int getHolderNumber(int hash) {
    return hash & (DEFAULT_INITIAL_CAPACITY - 1);
}
public void put(Favorites key, boolean value) {

    int userHash = key.hashCode();
    int hashValue = getSupplementalHash(userHash);

    int bucket = getHolderNumber(hashValue);
    MapEntries element = holder[bucket];

    for (; element != null; element = element.entry) {

        if (element.key.equals(key)) {
            System.out
                    .println("Note there is a duplicate found. Adding "
                            + key + ", with value " + value);
            element.value = value;
            return;
        } else {
            System.out.println("Removing task: "+ key + " as a non-favorite");
            remove(key);

        }
    }
    if (!value){
        System.out.println("Adding task: " + key + ", as none favorite");
        MapEntries currentBucket = new MapEntries(key, value);
        currentBucket.entry = holder[bucket];
        holder[bucket] = currentBucket;
    } else {
        System.out.println("Adding task: " + key + ", to favorite");
        MapEntries currentBucket = new MapEntries(key, value);
        currentBucket.entry = holder[bucket];
        holder[bucket] = currentBucket;
    }

}

public MapEntries get(Favorites key) {
    int value = getSupplementalHash(key.hashCode());
    int holderNumber = getHolderNumber(value);
    MapEntries existingElement = holder[holderNumber];

    while (existingElement != null) {
        System.out
                .println("Traversing the list inside the bucket for the key "
                        + existingElement.getKey());
        if (existingElement.key.equals(key)) {
            return existingElement;
        }
        existingElement = existingElement.entry;
    }
    return null;
}

public boolean remove (Favorites key){
    if (key == null){
        System.out.println("Nothing to remove");
        return false;
    }

    int value = getSupplementalHash(key.hashCode());
    if (holder[value] == null){
        return false;
    }
    else{
        MapEntries prev = null;
        MapEntries curr = holder[value];

        while (curr != null){
            if (curr.key.equals(key)){
                if (prev == null){
                    holder[value] = holder[value].entry;
                    return  true;
                }else {
                    prev.entry = curr.entry;
                    return true;
                }
            }
            prev = curr;
            curr = curr.entry;
        }

    }
    return false;
}

}

Проблема заключается в том, что при запуске программы внутри метода для отображения задач я не уверен, как показать их все в списке за пределами моегоМетод forFlected. Мои методы для моего меню и создания задачи.

static Scanner key = new Scanner(System.in);
static HashMaps hashMaps = new HashMaps(); 

public static void homeMenu(){
    int choice = 0;
    System.out.println(" App________________________");
    System.out.println( " Welcome! This part of our app lets you bookmark a \n"+
                        " task and set them as favorites");
    System.out.println(" Choose what you want to do:");
    System.out.println(" 1. Create a task\n 2. View all \n 3. Exit");
    System.out.println("");
    try {
    choice = Integer.parseInt(key.nextLine());
        while (choice != 2) {
            switch (choice) {
                case 1:
                    forFavorites();
                    break;

                case 2: 
                    showAllTasks(); //shows favorite and none favorite
                    break;
                case 3:
                    System.exit(0);
                    break;


                default:
                    System.out.println("Invalid Input, try again");
            }
        }
    }catch (NumberFormatException e){
        System.out.println("Invalid Input, try again");
        homeMenu();
    }
}

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

                favorited.display();

                System.out.println("Press enter to continue..");
                key.nextLine();
                break;
            } else {
                toFavorite.display();
                System.out.println("Press enter to continue..");
                key.nextLine();

            }


        }
        }
    homeMenu();


}

Это метод, который я пробовал до сих пор:

public static void showAll(){
     if(hashMaps.getSize() == 0){
        System.out.printf("\n\t%s\n", "No existing tasks to show.");
    } else {
        System.out.println();
        for (int i = 0; hashMaps.getListSize() > i; i++) {
            //hashMaps.toString; no toString yet
        }
    }
}

Мне нужен метод, где ожидаемый результат может выглядеть следующим образом после того, как пользователь выбрал для создания некоторых задач,и любимый и не любимый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...