Я создаю программу, в которой пользователь может создать выбранное количество задач, добавить к ним заголовок и указать, будет ли он избранным или нет.
Я установил свой ключ к классу под названием «Избранное» и статус «Избранное» или как логическое значение для значения:
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
}
}
}
Мне нужен метод, где ожидаемый результат может выглядеть следующим образом после того, как пользователь выбрал для создания некоторых задач,и любимый и не любимый