Searching through an array returns the wrong result

Hi guys, I have a code in ruby that reads from a file and then prints out the information as an array in the terminal. That part seems to work fine. However, the code should also prompt the user for input and then match the input with the information in the array. Right now, I am getting “Entry not found” regardless of the input.
The text file:

Neil Diamond
Greatest Hits
1
3
Crackling Rose
sounds/01-Cracklin-rose.wav
Soolaimon
sounds/06-Soolaimon.wav
Sweet Caroline
sounds/20-Sweet_Caroline.wav
require './input_functions'



module Genre
  POP, CLASSIC, JAZZ, ROCK = *1..4
end



class Album
  # you will need to add tracks to the following and the initialize()
	attr_accessor :title, :artist, :genre, :tracks

# complete the missing code:
	def initialize (title, artist, genre, tracks)
		# insert lines here
		@title = title
		@artist = artist
		@genre = genre
		@tracks = tracks
	end
end

class Track
	attr_accessor :name, :location

	def initialize (name, location)
		@name = name
		@location = location
	end
end

# Reads in and returns a single track from the given file

def read_track(music_file)
  track_name=music_file.gets.chomp
  track_location = music_file.gets.chomp
  track = Track.new(track_name, track_location)
  track.name= track_name
  track.location= track_location
  return track
	
end

# Returns an array of tracks read from the given file

def read_tracks(music_file)
	count = music_file.gets().to_i()
    tracks = Array.new()
	i=0
	while (i<count)
     track = read_track(music_file)
     tracks << track
     i+=1
	end  
    return tracks
  	

  # Put a while loop here which increments an index to read the tracks


end

# Takes an array of tracks and prints them to the terminal

def print_tracks(tracks)
  index = 0
  while (index<tracks.length)
    print_track (tracks[index])
    index+=1
   end
	.
end

# Reads in and returns a single album from the given file, with all its tracks

def read_album(music_file)
  album_title = music_file.gets
  album_artist = music_file.gets
  album_genre = music_file.gets.chomp.to_i
  
  tracks=read_tracks(music_file)
  album_tracks=tracks
  
  album = Album.new(album_title, album_artist, album_genre, album_tracks)
  album.title = album_title
  album.artist = album_artist
  album.genre = album_genre
  album.tracks = album_tracks
  
  return album


	
end


# Takes a single album and prints it to the terminal along with all its tracks
def print_album(album)
	genre_names = ['Null', 'Classic', 'Pop', 'Jazz', 'Rock']
  # print out all the albums fields/attributes
  # Complete the missing code.
	puts album.title
	puts album.artist
	puts('Genre is ' + album.genre.to_s())
	puts(genre_names[album.genre])
	tracks=album.tracks
	print_tracks(tracks)
	# print out the tracks

end

# Takes a single track and prints it to the terminal
def print_track(track)
  	  puts(track.name)
	  puts(track.location)
end


# search for track by name. This seems to be problem
# Returns the index of the track or -1 if not found
def search_for_track_name(tracks, search_string)
  index = 0
  found_index=-1
  
  while (index<tracks.length)
	if (tracks[index]==search_string)
		found_index=index
	end
	index+=1
    return found_index
	end
end
  

# Reads in an Album from a file and then prints all the album
# to the terminal

def main()
  	music_file = File.new("album.txt", "r")
	album = read_album(music_file)
	print_album(album)
	
  	music_file.close()
	puts "Enter the track name you wish to find: "
  	search_name = gets.chomp
  	
	index = search_for_track_name(album.tracks, search_name)
  	if index > -1
   		puts "Found " + album_tracks[index].name + " at " + index.to_s()
  	else
    	puts "Entry not Found"
  	end
end

main()

Look at your return found_index statement - it should end the method, but it’s in the while loop.

I fixed that but I am still getting “Entry not found” as before.

You are comparing the search term with the wrong thing: tracks[index] is the entire track instance. You want to compare the name, so change that line to:

    if (tracks[index].name==search_string)

Incidentally, in main, you also had album_tracks which is an unknown local variable. You intended album.tracks[index].name

Hi pcl, thank you for your help. With your suggestions and a bit more debugging, I was able to get it to work. Thank you again!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs