0

Hello everyone i have trouble searching a linked list. Basically I'm reading from a csv file and storing it in the linked list. I was able to add the list at the end. But when i search the list it keep saying it wasn't found. The method function is called contains. A method "contains" that takes a Country object as parameter and checks if the name of the country can be found in the list . to check whether object foo of type Country equals objects bar of type Country, you must override the "equals method" in class Country. When I'm running the code it returns not found and i found out the method contains from class countryNode returns null thats why its returns not found. I will appreciate the help thanks. Everything works except from the contains method. Below is my code:

public Country contains(Country obj)
{

   if(this.isEmpty())
   {
       System.out.println("Sorry this is an Empty list");
       return null;
   }
   else{
       CountryNode current = first;
        while(current!=null)
       {
           if(current.getCountry().equals(obj))
           {
                return current.getCountry();
               // break;
           }
           current = current.getNext();
       }
      return null;

   }     
}

The class Country and the overrides method equals:

public class Country {

private String countryNames;
private SubscriptionYear[] subscriptions;
private int size;
private int location;

public Country(String country)
{
    this.countryNames = country;
}
public Country(String country, int arraylength)
{
    this.countryNames = country;
    this.size = arraylength;
    subscriptions = new SubscriptionYear[size];
    location = 0;
}

public void addSubscriptionYear(int year, double subscription)
{
        subscriptions[location]= new SubscriptionYear(year, subscription);
        ++location;
}


public String toString()
{
    System.out.print(countryNames+"\t");
    for(SubscriptionYear s: subscriptions)
    {
        //System.out.print(countryNames+"\t");
        System.out.print(s.getSubscription()+"\t");
    }
    System.out.println();
    return  "";
}
 public String getName()
 {
    return this.countryNames;
 }

public boolean equals(Country obj)
{
    return (this.countryNames==obj.countryNames);
}
}

This my test main file:

import java.util.Random;
import java.util.Scanner;

 public class TestCountryList 
 {
  /**
  * Builds a list of countries to debug.
  */
  private void debugListOfCountries(Country [] allCountries)
  {
    // TO COMPLETE
  }

  /**
  * Builds a random list of countries.
  */
private void testRandomListOfCountries(Country [] allCountries)
{   
    Scanner keyboard = new Scanner(System.in);
    System.out.println("How many countries do you want to add to the list?");
    int requestedSize = keyboard.nextInt();

    // Build the list out of a random selection of countries.
    Random random = new Random();
    CountryList selectedCountries = new CountryList();
    for (int i = 0; i < requestedSize; i++)
    {
        int selectedIndex = random.nextInt(allCountries.length);
        selectedCountries.add(allCountries[selectedIndex]);
    }


    // Note: To debug your list, comment this line in
    System.out.println("List of countries: " + selectedCountries);


    // Check if the name of a country is in the list.
    // If the country is found, print the details.
    // Otherwise output not found.
    System.out.println("\nWhat country do you want to search for?");
    String countryToFind = keyboard.next();
    Country obj = new Country(countryToFind);
    Country foundCountry = selectedCountries.contains(obj);
    if (foundCountry != null)
    {
    System.out.println("Country " + countryToFind + " found with details:" + foundCountry);
    }
    else
        System.out.println("Country " + countryToFind + " not found.");

}

/**
 * Includes test examples for class GraphView.
 */
public static void main(String[] args) 
{
    // Create and set objects of type Country 
    //
    final String FILENAME = "data/cellular.csv";    // Directory path for Mac OS X
    //final String FILENAME = "data\cellular.csv";  // Directory path for Windows OS (i.e. Operating System)
    final int NUM_COUNTRIES_TO_TEST = 3;            // Note: Include test cases in addition to 3


    // Parse the CSV data file
    //
    CSVReader parser = new CSVReader(FILENAME);

    String [] countryNames = parser.getCountryNames();
    int [] yearLabels = parser.getYearLabels();
    double [][] parsedTable = parser.getParsedTable();      


    // Create and set objects of type Country 
    //
    Country [] countries;
    countries = new Country[NUM_COUNTRIES_TO_TEST];

    Country current;
    countries = new Country[countryNames.length];

    for (int countryIndex = 0; countryIndex < countries.length; countryIndex++)
    {
        int numberOfYears = yearLabels.length;   // OR numberOfYears = dataTable[countryIndex].length;

        current = new Country(countryNames[countryIndex], numberOfYears);

        for (int yearIndex = 0; yearIndex < numberOfYears; yearIndex++)
        {
            double [] allSubscriptions = parsedTable[countryIndex];
            double countryData = allSubscriptions[yearIndex];
            current.addSubscriptionYear(yearLabels[yearIndex], countryData);
        }
        countries[countryIndex] = current;
    }

    TestCountryList application = new TestCountryList();

    // Note: Initially, to test your output you may hard code the number of 
    //       countries added, and the array positions selected.
    //       However, make sure to comment this out before submitting your work.
    //application.debugListOfCountries(countries);

    application.testRandomListOfCountries(countries);
}
}
e_hello
  • 51
  • 1
  • 1
  • 5

2 Answers2

1

you need to use equals or equalsIgnoreCase to compare String

public boolean equals(Country obj)
{
    return this.countryNames.equals(obj.countryNames);
}
reto
  • 9,995
  • 5
  • 53
  • 52
aiwiguna
  • 2,852
  • 2
  • 15
  • 26
1

Try overriding equals method of Object as below:

public boolean equals(Object obj)
{
   if (this == obj) {
       return true;
   }
   if (obj == null) {
     return false;
   }
   if (getClass() != obj.getClass()) {
      return false;
   }
   return (this.countryNames.equals(((Country)obj).countryNames));
}

internally contains call countryList.equals method and equals method's signature is

 public boolean equals(Object obj) {}

As opposed to

 public boolean equals(Country obj) {}

Also you are just comparing two reference of strings while you need to compare the contents of String. So instead of

 this.countryNames==obj.countryNames

You should say:

 this.countryNames.equals(obj.countryNames);
SMA
  • 36,381
  • 8
  • 49
  • 73
  • Thanks a lot for the clarification. I forget about the comparing of addresses and not the contents. – e_hello Nov 05 '14 at 09:07