2012-04-09 6 views
0

Привет, ребята, кто-нибудь может сказать мне, где я ошибаюсь?arraylist: сравнение объекта со строкой

Основная цель этого класса - определить любимый архаист предметов, который в данном случае касается автомобилей. Объекты автомобилей имеют название автомобиля и рейтинг автомобиля 1-5.

как вы видите, если строка равна рейтингу объектов автомобиля. im messing часть, где вы сравниваете строку или int с объектом автомобиля в списке массивов. что не так с моим методом equals()? Может ли метод contains() работать одинаково?

Метод numberOfItemsOfRating позволяет пользователю указывать рейтинг и, следовательно, метод возвращает автомобили без рейтинга. метод searchForItems проверяет, соответствует ли описание String имя машины в списке массивов и, следовательно, возвращает автомобиль в arraylist.

здесь проблеск моих двух методов с конструкторами и переменными:

public class FavouriteItems 
{ 
    private ArrayList<Item> cars; 

    /** 
    * Constructor for objects of class FavouriteItems 
    */ 
    public FavouriteItems() 
    { 
     cars= new ArrayList<Item>(); 

    } 

    /** 
    * Add a new Item to your collection 
    * @param newItem The Item object to be added to the collection. 
    */ 
    public void addToFavourites(Item newItem) 
    { 
     cars.add(newItem); 

    } 
    /** 
    * Count the number of Items with a given rating 
    * @return The number of Items (Item objects) 
    *   whose rating is rating (could be 0). 
    *   If the rating parameter is outside the valid 
    *   range 1..5 then print an error message and return 0. 
    */ 
    public int numberOfItemsOfRating(int rating) 
    { 
     int counter = 0; 
     if(rating >= 1 && rating <=5) 
     { 
      for (int i =0; i < cars.size(); i++) 
      { 
       int num = rating; 
       String al = Integer.toString(rating); 
       if(cars.get(i).equals(al)) 
       { 
        counter++; 
       } 
      } 
     } 
     else 
     { 
      System.out.println("No cars match your ratings"); 
      counter = 0; 
     } 
     return counter; 
    } 

    /** 
    * Find the details of a Item given its description 
    * @return Item object if its description is in the collection 
    * or null if there is no item with that description 
    */ 
    public Item searchForItem(String description) 
    { 
     for(int i=0; i<cars.size(); i++) 
     { 
      if(cars.equals(description)) 
      { 
       return cars.get(i); 
      } 
      else 
      { 
       return null; 
      } 
     } 
     } 
} 
+1

метод equals() для автомобиля – mishadoff

+0

Это то, что я пробовал делать, но он не работает – Danial

+0

Вы сравниваете объект Item с Integer - это то, что вы намеревались? – tdrury

ответ

0

Это не так, как вы должны использовать метод equals, вместо этого я предлагаю вам использовать или реализовать Item#getRating() и Item#getDescription(). Используйте cars.get(i).getDescription().equals(description), чтобы проверить описание. Чтобы проверить рейтинг, используйте cars.get(i).getRating() == rating.

Вы не должны использовать equals для сравнения Item со строкой, поскольку это будет нарушать равные contract.

+0

это не имеет значения. Я понимаю, как ваше обращение к каждому конкретному элементу в arraylist, а не добавление get (i) было моей ошибкой. спасибо – Danial

+0

Вы не должны использовать метод equals of Car, чтобы проверить рейтинг или описание автомобиля. Вместо этого используйте методы getRating/getDesription для Car, а затем используйте ==, чтобы проверить рейтинг и использовать равные для проверки описания. – Sandro

+0

благодарит за рейтинг, который я использовал, если (cars.get (i) .getRating() == rating), и он сработал, позволяет увидеть, работает ли метод equals для searchitems: DX – Danial

0
cars.get(i) 

возвращает позицию, а не строка. Таким образом,

if(cars.get(i).equals(al)) 

Неправильная версия.

+0

как я могу вернуть товар? – Danial

+0

Вы уже делаете. @ Danial не хватало «s». –

+0

извините, ответ с iPad не прост, прежде всего, когда я не английский :) – dash1e

0
if(cars.equals(description)) 

Ваш ArrayList cars (весь список в данном случае) никогда не будет равно один String.

Если вы хотите найти автомобиль, вам необходимо будет проверить все элементы в своем списке и посмотреть, если их имя (или любая другая информация, хранящаяся в классе Item) соответствует указанному description.

+0

Да, это не то, что я пытаюсь сделать? и да, я думаю, это должно быть, если (cars.get (i) .equals (description)) это сработает? – Danial

+0

Это зависит от того, как вы реализовали метод 'equals' для класса' Item'. Если вы явно не реализовали его, это не сработает. –

1

Вы выполняете проверку равенства, основываясь на самом объекте, когда вместо этого вы должны делать это против свойств объекта. В вашем конкретном случае вы должны смотреть на атрибут rating каждого автомобиля/предмета в своей коллекции. Ваш код будет выглядеть примерно так:

final String ratingStr = Integer.toString(rating); 

int counter = 0; 
for (for final Item car: cars) { 
    if(ratingStr.equals(car.getRating()) { 
     ++counter; 
} 

System.out.println("Number of 'cars' with the rating is: " + counter); 

Два быстрых комментарии, вы должны реализовать методы равенства для вашего Item класса. Но в этом случае это не настоящий источник ваших проблем. Кроме того, вы упоминаете автомобили в своем коде, но ваш класс bean-класса называется «Item». Возможно, вы захотите смириться с этим, поскольку это потенциально запутывает других, кто читает ваш код.

Не забудьте также исправить свой метод searchForItem, в настоящее время вы проверяете равенство списка массивов на строку, которая никогда не вернет true. Исправьте его так же, как описано выше, но используя атрибут description вашего автомобиля, вместо атрибута rating.

+0

, который, похоже, не работает: s – Danial

+0

Что не работает? Вы определили методы в классе 'Item', чтобы получить/установить как« рейтинг », так и« описание »? – Perception

0

if(cars.get(i).equals(al)) Здесь вы сравнить строку с объектом, так что это неправильно упаковывают использования, что и может попробовать ниже кодирования

if(cars.get(i).getItem().equals(al)) 

можно где GetItem() один из переменной в автомобилях класса «item», введите «string» и поместите его getter и setter.

lly если (cars.equals (описание)) не правильный. Здесь и пытается сопоставить имя списка шпагата поэтому лучше использовать ниже кодирование

if(cars.get(i).getDescription().equals(description)) 
    return cars.get(i); 

можно где getDescription() один из переменных в автомобилях класса под названием «Описание», типа как «строка» и поместите его getter и setter.

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