2014-11-05 2 views
0

Привет всем, у меня проблемы с поиском связанного списка. В основном я читаю из файла csv и сохраняю его в связанном списке. Я смог добавить список в конце. Но когда я просматриваю список, он продолжает говорить, что он не найден. Функция метода называется contains. Метод «содержит», который принимает объект «Страна» в качестве параметра и проверяет, можно ли найти имя страны в списке. чтобы проверить, является ли объект foo типа Country равным объекту bar типа Country, вы должны переопределить метод equals в классе Country. Когда я запускаю код, он возвращается не найден, и я обнаружил, что метод содержит из класса countryNode возвращает null, поэтому его возврат не найден. Я буду благодарен за помощь. Все работает, кроме метода contains. Ниже мой код:Нужна помощь в поиске в связанном списке

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; 

    }  
} 

Класс страны и метод переопределяет равен:

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); 
} 
} 

Это мой тестовый файл главного:

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); 
} 
} 
+1

Пожалуйста, прочтите [Как сравнить строки в Java] (http://stackoverflow.com/questions/513832/how-do-i- compare-strings-in-java) – reto

+0

вы отправили здесь длинный код. попробуйте сократить его для вашего же блага. –

ответ

1

Try наиважнейшая составляет метод объекта, как показано ниже:

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)); 
} 

внутренне содержит метод countryList.equals вызова и составляет подпись метода является

public boolean equals(Object obj) {} 

В отличие от

public boolean equals(Country obj) {} 

Также вы просто сравнивая две ссылки строк, в то время как вам нужно сравнить содержимое String. Таким образом, вместо

this.countryNames==obj.countryNames 

Вы должны сказать:

this.countryNames.equals(obj.countryNames); 
+0

Большое спасибо за разъяснение. Я забываю о сравнении адресов, а не о содержании. –

1

вам нужно использовать equals или equalsIgnoreCase для сравнения Строка

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

Вы не являетесь основным символом объекта. – SMA

Смежные вопросы