88 Program Playlist Java You will be building a linked list
8.8 Program: Playlist (Java)
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
insertAfter() (1 pt)
setNext() - Mutator (1 pt)
getID() - Accessor
getSongName() - Accessor
getArtistName() - Accessor
getSongLength() - Accessor
getNext() - Accessor
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 outputs a menu of options to manipulate the playlist. 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:
(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:
Solution
SongEntry.java
package playlist;
public class SongEntry {
private String uniqueID;
private String songName;
private String artistName;
private int songLength;
SongEntry nextNode;
SongEntry()
{
uniqueID = \"\";
songName = \"\";
artistName = \"\";
songLength = 0;
nextNode = null;
}
SongEntry(String uniqueID, String songName, String artistName, int songLength)
{
this.uniqueID = uniqueID;
this.songName = songName;
this.songLength = songLength;
this.artistName = artistName;
this.nextNode = null;
}
public void insertAfter( SongEntry entry)
{
SongEntry entries = this;
while(entries.nextNode != null)
{
entries = entries.nextNode;
}
entries.nextNode = entry;
}
public void setNext(SongEntry entry){
this.nextNode = entry;
}
public String getID()
{
return this.uniqueID;
}
public String getSongName()
{
return this.songName;
}
public String getArtistName()
{
return this.artistName;
}
public int getSongLength()
{
return this.songLength;
}
public SongEntry getNext()
{
return this.nextNode;
}
public void printPlaylistSongs()
{
System.out.println(\"Unique ID: \"+getID());
System.out.println(\"Song Name: \"+getSongName());
System.out.println(\"Artist Name: \"+getArtistName());
System.out.println(\"Song Length(in seconds): \"+getSongLength());
}
}
Playlist.java
package playlist;
import java.util.Scanner;
public class Playlist {
public static Scanner sc = new Scanner(System.in);
public static Scanner scInt = new Scanner(System.in);
public static SongEntry headSong = new SongEntry();
public static SongEntry tailSong = new SongEntry();
public static SongEntry allEntries;
public static int numberOfNodes = 0;
public static void printMenu(String playlistTitle)
{
System.out.println(\"\ \"+playlistTitle.toUpperCase()+\" PLAYLIST MENU\");
System.out.println(\"a - Add song\ d - Remove song\ c - Change position of song\ s - Output songs by specific artist\");
System.out.println(\"t - Output total time of playlist (in seconds)\ o - Output full playlist\ q - Quit\");
System.out.println(\"\ Choose an option: \");
String option = sc.next();
boolean isEnter = option.equals(\"a\") || option.equals(\"d\") || option.equals(\"c\") || option.equals(\"s\") || option.equals(\"t\") || option.equals(\"o\") || option.equals(\"q\");
if(isEnter)
{
switch(option.charAt(0))
{
case \'a\': addSong();
printMenu(playlistTitle);
break;
case \'d\': allEntries = removeSong(allEntries);
printMenu(playlistTitle);
break;
case \'c\': allEntries = changeSongPosition(allEntries);
printMenu(playlistTitle);
break;
case \'s\': songsBySpecificArtist(allEntries);
printMenu(playlistTitle);
break;
case \'t\': totalTimeofPlaylist(allEntries);
printMenu(playlistTitle);
break;
case \'o\': outputFullPlaylist(allEntries);
printMenu(playlistTitle);
break;
case \'q\': break;
}
}
else
{
System.out.println(\"Invalid Choice !\");
printMenu(playlistTitle);
}
}
public static void outputFullPlaylist(SongEntry entries)
{
int counter = 1;
if(entries != null)
{
System.out.println(counter+\".\");
entries.printPlaylistSongs(); // head node
counter++;
while(entries.nextNode != null) // all the remaining nodes
{
entries = entries.nextNode;
System.out.println(counter+\".\");
entries.printPlaylistSongs();
counter++;
}
}
else
{
System.out.println(\"Playlist is empty\");
}
}
public static void addSong()
{
sc = new Scanner(System.in);
System.out.println(\"ADD SONG\");
System.out.println(\"Enter song\'s Unique ID: \");
String songID = sc.next();
sc = new Scanner(System.in);
System.out.println(\"Enter song\'s name: \");
String songname = sc.nextLine();
sc = new Scanner(System.in);
System.out.println(\"Enter artist\'s name: \");
String artistName = sc.nextLine();
System.out.println(\"Enter song\'s length(in seconds): \");
int songlength = scInt.nextInt();
SongEntry entry = new SongEntry(songID, songname, artistName, songlength);
if(allEntries == null)
{
headSong = entry; // this is the head
allEntries = entry;
tailSong = entry; // this is the tail
numberOfNodes++;
}
else
{
allEntries.insertAfter(entry);
tailSong = entry;
numberOfNodes++;
}
}
public static SongEntry removeSong(SongEntry entries)
{
System.out.println(\"Enter the song\'s unique ID: \");
String id = sc.next();
SongEntry newEntry = null, entry=null;
int counter = 0;
while(entries != null)
{
if(counter!=0)
{
newEntry.nextNode = null;
newEntry = newEntry.nextNode;
}
if(!entries.getID().equals(id))
{
newEntry = new SongEntry();
newEntry.setUniqueID(entries.getID());
newEntry.setSongName(entries.getSongName());
newEntry.setArtistName(entries.getArtistName());
newEntry.setSongLength(entries.getSongLength());
if(entry == null)
entry = newEntry;
else
entry.insertAfter(newEntry);
counter++;
}
else
{
System.out.println(entries.getSongName()+\" removed\");
numberOfNodes--;
}
entries = entries.nextNode;
}
return entry;
}
public static SongEntry changeSongPosition(SongEntry entries)
{
System.out.println(\"CHANGE POSITION OF SONG\");
System.out.println(\"ENTER song\'s current position: \");
int currentPos = scInt.nextInt();
System.out.println(\"Enter new position of song: \");
int newPos = scInt.nextInt();
SongEntry currentPosEntry = null, entry = null, newPosEntry = null, returnEntry = null;
entry = entries;
int counter = 1;
// System.out.println(\"Number of nodes: \" + numberOfNodes);
if(newPos<1)
newPos = 1;
else if(newPos>numberOfNodes)
newPos = numberOfNodes;
System.out.println(\"cuurent pos: \"+currentPos);
System.out.println(\"new pos: \"+newPos);
for(int i=1; i<=numberOfNodes; i++)
{
if(i==currentPos)
currentPosEntry = entries;
else if(i==newPos)
newPosEntry = entries;
else
entries = entries.nextNode;
}
// System.out.println(\"After for loop\");
//System.out.println(\"Current song details\" ); currentPosEntry.printPlaylistSongs();
// System.out.println(\"New song details\"); newPosEntry.printPlaylistSongs();
entries = entry;
while(counter <= numberOfNodes+1)
{
if(counter == currentPos) // we need to adjust the current position
{
entries = entries.nextNode;
if(entries !=null)
{
entry = new SongEntry(entries.getID(), entries.getSongName(), entries.getArtistName(), entries.getSongLength());
if(returnEntry == null)
returnEntry = entry;
else
returnEntry.insertAfter(entry);
entries = entries.nextNode;
}
counter++;
}
else if(counter == newPos)
{
entry = currentPosEntry;
entry.nextNode = null;
if(returnEntry == null)
returnEntry = entry;
else
returnEntry.insertAfter(entry);
counter++;
}
else
{
if(entries !=null)
{
entry = new SongEntry(entries.getID(), entries.getSongName(), entries.getArtistName(), entries.getSongLength());
if(returnEntry == null)
returnEntry = entry;
else
returnEntry.insertAfter(entry);
entries = entries.nextNode;
}
counter++;
}
}
return returnEntry;
}
public static void totalTimeofPlaylist(SongEntry entries)
{
System.out.println(\"OUTPUT TOTAL TIME OF PLAYLIST (IN SECONDS)\");
int totalSeconds = entries.getSongLength();
entries = entries.nextNode;
while(entries != null)
{
totalSeconds += entries.getSongLength();
entries = entries.nextNode;
}
System.out.println(\"Total Time: \"+totalSeconds+\" seconds\");
}
public static void songsBySpecificArtist(SongEntry entries)
{
sc = new Scanner(System.in);
System.out.println(\"OUTPUT SONGS BY SPECIFIC ARTIST\");
System.out.println(\"Enter artist\'s name: \");
String artistname = sc.nextLine();
while(entries != null)
{
if(entries.getArtistName().equals(artistname))
{
entries.printPlaylistSongs();
}
entries = entries.nextNode;
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(\"Enter playlist\'s title: \");
sc = new Scanner(System.in);
String title = sc.nextLine();
printMenu(title);
}
}
OUTPUT:
Enter playlist\'s title:
jem
JEM 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
ADD SONG
Enter song\'s Unique ID:
s1
Enter song\'s name:
All for you
Enter artist\'s name:
Minda
Enter song\'s length(in seconds):
234
JEM 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
ADD SONG
Enter song\'s Unique ID:
s2
Enter song\'s name:
good for you
Enter artist\'s name:
selena gomez
Enter song\'s length(in seconds):
233
JEM 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:
d
Enter the song\'s unique ID:
s1
All for you removed
JEM 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
1.
Unique ID: s2
Song Name: good for you
Artist Name: selena gomez
Song Length(in seconds): 233
JEM 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:
t
OUTPUT TOTAL TIME OF PLAYLIST (IN SECONDS)
Total Time: 233 seconds
JEM 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
ADD SONG
Enter song\'s Unique ID:
s3
Enter song\'s name:
baby
Enter artist\'s name:
justin beiber
Enter song\'s length(in seconds):
221
JEM 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:
s
OUTPUT SONGS BY SPECIFIC ARTIST
Enter artist\'s name:
selena gomez
Unique ID: s2
Song Name: good for you
Artist Name: selena gomez
Song Length(in seconds): 233
JEM 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:
c
CHANGE POSITION OF SONG
ENTER song\'s current position:
1
Enter new position of song:
2
cuurent pos: 1
new pos: 2
JEM 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
1.
Unique ID: s3
Song Name: baby
Artist Name: justin beiber
Song Length(in seconds): 221
2.
Unique ID: s2
Song Name: good for you
Artist Name: selena gomez
Song Length(in seconds): 233
JEM 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: q
















