Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

You will be building a linked list. Make sure to keep track of both the head and

ID: 3798706 • Letter: Y

Question

You will be building a linked list. Make sure to keep track of both the head and tail nodes.

(1) Create two files to submit.

SongEntry.java - Class declaration

Playlist.java - Contains main() method

Build the SongEntry class per the following specifications. Note: Some methods can initially be method stubs (empty methods), to be completed in later steps.

Private fields

String uniqueID - Initialized to "none" in default constructor

string songName - Initialized to "none" in default constructor

string artistName - Initialized to "none" in default constructor

int songLength - Initialized to 0 in default constructor

SongEntry nextNode - Initialized to null in default constructor

Default constructor (1 pt)

Parameterized constructor (1 pt)

Public member methods

void insertAfter(SongEntry currNode) (1 pt)

void setNext(SongEntry nextNode) - Mutator (1 pt)

String getID()- Accessor

String getSongName() - Accessor

String getArtistName() - Accessor

int getSongLength() - Accessor

SongEntry getNext() - Accessor

void printPlaylistSongs()

Ex. of printPlaylistSongs output:

(2) In main(), prompt the user for the title of the playlist. (1 pt)

Ex:


(3) Implement the printMenu() method. printMenu() takes the playlist title as a parameter and a Scanner object, outputs a menu of options to manipulate the playlist, and reads the user menu selection. Each option is represented by a single character. Build and output the menu within the method.

If an invalid character is entered, continue to prompt for a valid choice. Hint: Implement Quit before implementing other options. Call printMenu() in the main() method. Continue to execute the menu until the user enters q to Quit. (3 pts)

Ex:


(4) Implement "Output full playlist" menu option. If the list is empty, output: Playlist is empty (3 pts)

Ex:


Ex (empty playlist):


(5) Implement the "Add song" menu item. New additions are added to the end of the list. (2 pts)

Ex:


(6) Implement the "Remove song" method. Prompt the user for the unique ID of the song to be removed.(4 pts)

Ex:


(7) Implement the "Change position of song" menu option. Prompt the user for the current position of the song and the desired new position. Valid new positions are 1 - n (the number of nodes). If the user enters a new position that is less than 1, move the node to the position 1 (the head). If the user enters a new position greater than n, move the node to position n (the tail). 6 cases will be tested:

Moving the head node (1 pt)

Moving the tail node (1 pt)

Moving a node to the head (1 pt)

Moving a node to the tail (1 pt)

Moving a node up the list (1 pt)

Moving a node down the list (1 pt)

Ex:


(8) Implement the "Output songs by specific artist" menu option. Prompt the user for the artist's name, and output the node's information, starting with the node's current position. (2 pt)

Ex:


(9) Implement the "Output total time of playlist" menu option. Output the sum of the time of the playlist's songs (in seconds). (2 pts)

Ex:

PROVIDE FULL CODES AND SAMPLE SUCCESSFUL OUTPUT!!! THANKS!

Explanation / Answer

Please find the below Java code using linked list operation for playlist operation:

public class SongEntry {
   private String uniqueID;
   private String songName;
   private String artistName;
   private int songLength;
   private SongEntry nextNode;

   /**
   * Default constructor
   */
   public SongEntry() {
       this.uniqueID = "none";
       this.songName = "none";
       this.artistName = "none";
       this.songLength = 0;
       this.nextNode = null;
   }

   /**
   * Parameterized constructor
   *
   * @param uniqueID
   * @param songName
   * @param artistName
   * @param songLength
   * @param nextNode
   */
   public SongEntry(String uniqueID, String songName, String artistName, int songLength, SongEntry nextNode) {
       this.uniqueID = uniqueID;
       this.songName = songName;
       this.artistName = artistName;
       this.songLength = songLength;
       this.nextNode = nextNode;
   }

   void insertAfter(SongEntry currNode) {
       this.nextNode=currNode;
   }

   void setNext(SongEntry nextNode) {
       // Mutator
       this.nextNode=nextNode;
   }

   String getID() {
       // Accessor
       return uniqueID;
   }

   String getSongName() {
       // - Accessor
       return songName;
   }

   String getArtistName() {
       // - Accessor
       return artistName;
   }

   int getSongLength() {
       // - Accessor
       return songLength;
   }

   SongEntry getNext() {
       // - Accessor
       return nextNode;
   }

   void printPlaylistSongs() {
       System.out.println("Unique ID:" + uniqueID);
       System.out.println("Song Name:" + songName);
       System.out.println("Artist Name:" + artistName);
       System.out.println("Song Length (in seconds):" + songLength);

   }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PlayList {

   private SongEntry head;
   private SongEntry tail;

   private String playlistsTitle;

   public static void main(String[] args) {
       try (BufferedReader scanner = new BufferedReader(new InputStreamReader(System.in))) {
           PlayList playList = new PlayList();
           System.out.println("Enter playlist's title:");
           playList.playlistsTitle = scanner.readLine();
           String choice = "";
           while (true) {
               printMenu();
               choice = scanner.readLine();
               switch (choice) {
               case "a":
                   playList.head = playList.addSong(scanner);
                   break;
               case "d":
                   playList.removeSong(scanner);
                   break;
               case "c":
                   playList.changePosition(scanner);
                   break;
               case "s":
                   playList.outpuSongsBySpecificArtist(scanner);
                   break;
               case "t":
                   playList.outputTotalTimeOfPlaylist();
                   break;
               case "o":
                   playList.outputFullPlaylist();
                   break;

               default:
                   System.out.println("Wrong option! Try again!");
                   break;
               }
           }

       } catch (IOException e) {
           e.printStackTrace();
       }

   }

   /**
   * printMenu
   */
   private static void printMenu() {
       System.out.println("JAMZ PLAYLIST MENU");
       System.out.println("a - Add song");
       System.out.println("d - Remove song");
       System.out.println("c - Change position of song");
       System.out.println("s - Output songs by specific artist");
       System.out.println("t - Output total time of playlist (in seconds)");
       System.out.println("o - Output full playlist");
       System.out.println("q - Quit");
       System.out.println("Choose an option:");

   }

   /**
   * outputFullPlaylist
   */
   public void outputFullPlaylist() {
       System.out.println(playlistsTitle + " - OUTPUT FULL PLAYLIST");
       if (head == null) {
           System.out.println("Playlist is empty");
           return;
       }

       // Print full playlist
       int index = 1;
       while (head.getNext() != null) {
           System.out.println(index + ".");
           head.printPlaylistSongs();
           head=head.getNext();
       }
       System.out.println(index+1 + ".");
       head.printPlaylistSongs();
   }

   /**
   *
   * @param scanner
   * @return
   * @throws IOException
   */
   public SongEntry addSong(BufferedReader scanner) throws IOException {
       System.out.println("Enter song's unique ID:");
       String uniqueID = scanner.readLine();
       System.out.println("Enter song's name:");
       String songName = scanner.readLine();
       System.out.println("Enter artist's name:");
       String artistName = scanner.readLine();
       System.out.println("Enter song's length (in seconds):");
       int songLength = Integer.parseInt(scanner.readLine());
       SongEntry newSongEntry = new SongEntry(uniqueID, songName, artistName, songLength, null);
       // Check list is empty
       if (head == null) {
           head = newSongEntry;
           tail = newSongEntry;
           return head;
       }
       // Save the reference to the header so we can return it.
       SongEntry temp = head;
       // loop until find the end of the list
       while (head.getNext() != null) {
           head = head.getNext();
       }

       // add the new newSongEntry
       head.setNext(newSongEntry);
       tail = head;
       return temp;
   }

   /**
   * removeSong
   *
   * @param scanner
   * @throws IOException
   */
   public void removeSong(BufferedReader scanner) throws IOException {
       System.out.println("REMOVE SONG");
       System.out.println("Enter song's unique ID:");
       String uniqueID = scanner.readLine();
       SongEntry temp = head;
       SongEntry prev = null;
       // If head node itself holds the key or multiple occurrences of key
       while (temp != null && temp.getID().equals(uniqueID)) {
           head = temp.getNext(); // Changed head
           temp = head; // Change Temp
       }

       // Delete occurrences other than head
       while (temp != null) {
           // Search for the key to be deleted, keep track of the
           // previous node as we need to change 'prev->next'
           while (temp != null && !temp.getID().equals(uniqueID)) {
               prev = temp;
               temp = temp.getNext();
           }

           // If key was not present in linked list
           if (temp == null)
               return;

           // Unlink the node from linked list
           prev.setNext(temp.getNext());

           // Update Temp for next iteration of outer loop
           temp = prev.getNext();
       }
       System.out.println(""All For You" removed");

   }

   /**
   * changePosition
   *
   * @param scanner
   * @throws IOException
   * @throws NumberFormatException
   */
   public void changePosition(BufferedReader scanner) throws NumberFormatException, IOException {
       System.out.println("CHANGE POSITION OF SONG");
       System.out.println("Enter song's current position:");
       int currentPosition = Integer.parseInt(scanner.readLine());
       System.out.println("Enter new position for song:");
       int newPosition = Integer.parseInt(scanner.readLine());

       // Nothing to do if currentPosition and newPosition are same
       if (currentPosition == newPosition)
           return;

       // Search for currentPosition (keep track of prevCurrentPosition and
       // currCurrentPosition)
       SongEntry prevCurrentPosition = null, currCurrentPosition = head;
       int positionCounter = 1;
       while (currCurrentPosition != null && positionCounter != currentPosition) {
           prevCurrentPosition = currCurrentPosition;
           currCurrentPosition = currCurrentPosition.getNext();
           positionCounter++;
       }

       // Search for newPosition (keep track of prevY and currY)
       SongEntry prevNewPosition = null, currNewPosition = head;
       positionCounter = 1;
       while (currNewPosition != null && positionCounter != newPosition) {
           prevNewPosition = currNewPosition;
           currNewPosition = currNewPosition.getNext();
           newPosition++;
       }

       // If either currCurrentPosition or currNewPosition is not present,
       // nothing to do
       if (currCurrentPosition == null || currNewPosition == null)
           return;

       // If prevCurrentPosition is not head of linked list
       if (prevCurrentPosition != null)
           prevCurrentPosition.setNext(currNewPosition);
       else // make currNewPosition the new head
           head = currNewPosition;

       // If prevNewPosition is not head of linked list
       if (prevNewPosition != null)
           prevNewPosition.setNext(currCurrentPosition);
       else // make currCurrentPosition the new head
           head = currCurrentPosition;

       // Swap next pointers
       SongEntry temp = currCurrentPosition.getNext();
       currCurrentPosition.setNext(currNewPosition.getNext());
       currNewPosition.setNext(temp);

       System.out.println(currCurrentPosition.getSongName() + " moved to position " + newPosition);

   }

   public void outpuSongsBySpecificArtist(BufferedReader scanner) throws IOException {
       System.out.println("OUTPUT SONGS BY SPECIFIC ARTIST");
       System.out.println("Enter artist's name:");
       String artistsName = scanner.readLine();

       if (head == null) {
           System.out.println("Playlist is empty");
           return;
       }

       // Print full playlist
       int index = 1;
       while (head.getNext() != null) {
           if (head.getArtistName().equals(artistsName)) {
               System.out.println(index + ".");
               head.printPlaylistSongs();
           }
           head=head.getNext();
       }
      
       if (head.getArtistName().equals(artistsName)) {
           System.out.println(index+1 + ".");
           head.printPlaylistSongs();
       }
      
   }

   public void outputTotalTimeOfPlaylist() {
       System.out.println("OUTPUT TOTAL TIME OF PLAYLIST (IN SECONDS)");
       if (head == null) {
           System.out.println("Playlist is empty");
           return;
       }
       // Print full playlist
       int totalTime = 0;
       while (head.getNext() != null) {
           totalTime += head.getSongLength();
           head=head.getNext();
       }
       totalTime += head.getSongLength();
       System.out.println("Total time: "+totalTime);
   }

}

Steps to compile & run the above program:

1. Compile:

javac SongEntry.java

javac PlayList.java

2. Run:

java PlayList

Sample output:

Enter playlist's title:
JAMZ
JAMZ PLAYLIST MENU
a - Add song
d - Remove song
c - Change position of song
s - Output songs by specific artist
t - Output total time of playlist (in seconds)
o - Output full playlist
q - Quit
Choose an option:
a
Enter song's unique ID:
AHHUUS
Enter song's name:
abc
Enter artist's name:
xyz
Enter song's length (in seconds):
12
JAMZ PLAYLIST MENU
a - Add song
d - Remove song
c - Change position of song
s - Output songs by specific artist
t - Output total time of playlist (in seconds)
o - Output full playlist
q - Quit
Choose an option:
a
Enter song's unique ID:
PQRSJJ
Enter song's name:
qqw
Enter artist's name:
asas
Enter song's length (in seconds):
15
JAMZ PLAYLIST MENU
a - Add song
d - Remove song
c - Change position of song
s - Output songs by specific artist
t - Output total time of playlist (in seconds)
o - Output full playlist
q - Quit
Choose an option:
o
JAMZ - OUTPUT FULL PLAYLIST
1.
Unique ID:AHHUUS
Song Name:abc
Artist Name:xyz
Song Length (in seconds):12
2.
Unique ID:PQRSJJ
Song Name:qqw
Artist Name:asas
Song Length (in seconds):15
JAMZ PLAYLIST MENU
a - Add song
d - Remove song
c - Change position of song
s - Output songs by specific artist
t - Output total time of playlist (in seconds)
o - Output full playlist
q - Quit
Choose an option:

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote