How to delete an object within a Hashmap

77 Views Asked by At

I'm trying to find a way to delete a student within a Hashmap. My attempt is under (choice == 8). Unfortunately after I try to delete a student (along with his/her quiz scores), the name still appears. Any help would be much appreciated.

package studentquizgrades;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class StudentQuizGrades {

public static void main(String[] args) {
    Map<String, Student> map = new HashMap<>();

    addStudent(map);

}

private static void addStudent(Map<String, Student> map) {
    Scanner userInput = new Scanner(System.in);

    boolean finish = false;


    do {
        System.out.println("Please choose an option: ");
        System.out.println("Add student and quizzes - 1, Get all quiz scores - 2, Get highest quiz score- 3, ");
        System.out.println("Get lowest quiz score - 4, Get class average - 5, View a list of all students - 6");
        System.out.println("Get a student's quiz scores - 7, Delete student- 8, Quit - 9");
        int choice = userInput.nextInt();

        if (choice == 1) {
            Set<String> keySet = map.keySet();
            System.out.println("How many students would you like to add?");
            int numberOfStudents = userInput.nextInt();
            for (int counter = 0; counter < numberOfStudents; counter++) {

                System.out.println("ENTER NAME");
                Scanner addName = new Scanner(System.in);
                String name = (addName.nextLine());

                System.out.println("Enter First Quiz Score");
                Scanner addQuiz1 = new Scanner(System.in);
                int quiz1 = (addQuiz1.nextInt());

                System.out.println("Enter Second Quiz Score");
                Scanner addQuiz2 = new Scanner(System.in);
                int quiz2 = (addQuiz2.nextInt());

                System.out.println("Enter Third Quiz Score");
                Scanner addQuiz3 = new Scanner(System.in);
                int quiz3 = (addQuiz3.nextInt());
                Student student = new Student(name, quiz1, quiz2, quiz3);
                map.put(student.getKey(), student);

            }

        } else if (choice == 2) {
            Set<String> keySet = map.keySet();
            for (String currentKey : keySet) {
                Student student = map.get(currentKey);
                System.out.println();
                System.out.println(currentKey);
                System.out.println(Arrays.toString(student.getQuizGrades()));
                System.out.println();

            }

        } else if (choice == 3) {
            Set<String> keySet = map.keySet();
            int max = 0;
            String maxName = null;

            for (String currentKey : keySet) {

                Student student = map.get(currentKey);
                int[] scores = student.getQuizGrades();

                for (int counter = 1; counter < scores.length; counter++) {
                    if (scores[counter] > max) {
                        max = scores[counter];
                        maxName = currentKey;
                    }
                }
            }
            System.out.println();
            System.out.println("The highest quiz score was " + max + "; his/her name is " + maxName);
            System.out.println();

        } else if (choice == 4) {
            Set<String> keySet = map.keySet();
            int min = Integer.MAX_VALUE;
            String minName = null;

            for (String currentKey : keySet) {
                Student student = map.get(currentKey);
                int index = 0;
                int[] scores = student.getQuizGrades();

                for (int counter = 0; counter < scores.length; counter++) {
                    if (scores[counter] < min) {
                        minName = currentKey;
                        min = scores[counter];

                    }

                }

            }
            System.out.println();
            System.out.println("The lowest quiz score was " + min + "; his or her name is " + minName);
            System.out.println();

        } else if (choice == 5) {
            Set<String> keySet = map.keySet();
            int[] allGrades;
            int sum = 0;
            int counter2 = 0;
            for (String currentKey : keySet) {
                Student student = map.get(currentKey);
                int[] scores = student.getQuizGrades();
                for (int counter = 0; counter < scores.length; counter++) {
                    int j = scores[counter];
                    sum = sum + j;
                    counter2++;
                }

            }
            int average = sum / counter2;
            System.out.println("");
            System.out.println("The class average is: " + average);
            System.out.println("");
        } else if (choice == 6) {
            Set<String> keySet = map.keySet();
            System.out.println("");
            System.out.println("List of students: ");
            for (String currentKey : keySet) {
                Student student = map.get(currentKey);

                System.out.println(currentKey);

            }
        } 
        else if(choice == 7){


            Set<String> keySet = map.keySet();
            System.out.println("");
            System.out.println("Please enter a student's name: ");
            String studentName = userInput.next();
            for (String currentKey : keySet) {

                Student student = map.get(currentKey);

                if(studentName.equals(currentKey)){

                    System.out.println(currentKey + "'s quiz scores:");
                    int [] quizArray = student.getQuizGrades();
                    for(int counter1 = 0; counter1 < quizArray.length; counter1++ ){

                        System.out.println(quizArray[counter1]);

                    }
                }

            }
        }


                    else if(choice == 8){


            Set<String> keySet = map.keySet();
            System.out.println("");
            System.out.println("Please enter a student's name: ");
            String studentName = userInput.next();
            for (String currentKey : keySet) {

                Student student = map.get(currentKey);

                if(studentName.equals(currentKey)){

                    student = null;
                }

            }
        }


        else if (choice == 9) {
            finish = true;
            break;
        }
    } while (finish == false);
}
}

public class Student {
private String key;
private int grade1;
private int grade2;
private int grade3;

    public Student(String key, int grade1, int grade2, int grade3){
        this.key = key;
        this.grade1 = grade1;
        this.grade2 = grade2;
        this.grade3 = grade3;
    }

    public String getKey(){
        return key;
    }

    public int[] getQuizGrades(){
       int [] anArray = {grade1, grade2, grade3};
       return anArray;
    }

    public int getAverageScore(){
        int average = (grade1 + grade2 + grade3)/3;
        return average;
    }
}
2

There are 2 best solutions below

0
On
 Student student = map.get(currentKey);

 if(studentName.equals(currentKey)){

     student = null;
 }

Putting student to null doesn't mean that object in map has been removed or deleted. It just means that reference with name student is no more pointing to any object.

You should look at Java APIs. https://docs.oracle.com/javase/7/docs/api/

https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#remove(java.lang.Object)

0
On

Student student = map.get(currentKey);// Assigning map value(Student) to local Student variable if(studentName.equals(currentKey)){ student = null; // Assigning null to that local Student variable, so it won't updated in existing map }

Put map.put(currentKey , null) // updating null to map (Or) map.remove(currentKey) // removes entry from map