Two possible solutions but which one? Or is there a Better?
I have a class MP3Track with members: Track number (int), track name (String), artist (String), in faourites (boolean) etc. My catalogue class contains two ArrayList
s, one containing all tracks (vectorMain) and the other containing favourites (vectorFav) which are copies of the tracks in the main catalogue.
I want the user to have the option of swapping two track numbers (which are unique in both arrays).
Sample printout of the main catalogue below:
Both samples get the desired result but:
- (Solution 1) deleted as didn't work in reverse.
- (Solution 2) Below Seems rather cumbersome!
- (Solution 3) Below Seems more elegant but very long winded!
getMainIndex()
- returns the index position in the ArrayList
for a given track number or -1
.
Here is Solution 2 (overcame problem of solution 1 - but ugly)
Here is start of method:
public void swapTrack(){ int t1 = -1, t2 = -1; System.out.println(face.getSwapTrackMenu()); System.out.print("1) Please enter first track number to swap: "); t1 = scan.readInt(); System.out.print("2) Please enter second track number to swap: "); t2 = scan.readInt(); MP3Track mp31 = null; MP3Track mp32 = null;
Now solution 2
if((getMainIndex(t1)!=-1)&&(getMainIndex(t2)!=-1)){ String s1 = null; String s2 = null; for(MP3Track track : vectorMain){ if(track.getTrackNo() == t1){ s1 = track.getTitle(); } if(track.getTrackNo() == t2){ s2 = track.getTitle(); } } for(MP3Track track : vectorMain){ if(track.getTitle().equals(s1)){ track.setTrackNo(t2); } if(track.getTitle().equals(s2)){ track.setTrackNo(t1); } } for(MP3Track track : vectorFav){ if(track.getTitle().equals(s1)){ track.setTrackNo(t2); } if(track.getTitle().equals(s2)){ track.setTrackNo(t1); } } }
Here is Solution 3
//Loop thorugh main (ArrayList) looking for both track numbers for(MP3Track track : vectorMain){ if(track.getTrackNo() == t1){ //If track 1 found assign it to temp var mp31 = vectorMain.get(getMainIndex(t1)); } if(track.getTrackNo() == t2){ //If track 2 found assign it to temp var mp32 = vectorMain.get(getMainIndex(t2)); } } //Check if we found track 1 if(vectorMain.contains(mp31)){ //Set temp var new track number mp31.setTrackNo(t2); } //Check if we found track 2 if(vectorMain.contains(mp32)){ //Set temp var new track number mp32.setTrackNo(t1); } mp31 = null; //Remove pointer reference mp32 = null; //Remove pointer reference //loop thorugh Fav (ArrayList) looking for track numbers for(MP3Track track : vectorFav){ if(track.getTrackNo() == t1){ //Assign it to temp var mp31 = vectorFav.get(getFavIndex(t1)); } if(track.getTrackNo() == t2){ //Assign it to temp var mp32 = vectorFav.get(getFavIndex(t2)); } } //Check if we found it first if(vectorFav.contains(mp31)){ mp31.setTrackNo(t2); } //Check if we found it first if(vectorFav.contains(mp32)){ mp32.setTrackNo(t1); }
Is there something I'm missing here? I've hit a wall as to a better solution!!
I'm new to Java so any suggestions, improvements & comments appreciated.
Many thanks
trackNo
is an identity field. It should not be changed. Why would your user want to swap some arbitrary number used to identify tracks?\$\endgroup\$