Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите пожалуйста реализовать Comparable 
V
    Опции темы
natika
  Дата 28.3.2014, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Добрый день, уже несколько дней мучаюсь с Comparable, мне нужно вводимые значения с клавиатуры сравнить со значением которые находятся внутри объекта класса Film. например мне нужно найти фильм по названию я создала временный объект сохранила туда введеное название и сравниваю теперь его с названиями фильмов. Мой временный объект находится в классе Gestion. Вот главная функция через которую проходит поиск она находится тоже в классе Gestion:

Код
 public static void findFilm(){

Scanner saisie = new Scanner(System.in);
System.out.println("что бы найти фильм по названию нажмите 1 по продюсеру 2 и по категории 3");
int selection = Integer.parseInt(saisie.nextLine());
if (selection == 1 ){
System.out.println("Введите название фильма");
String titre = saisie.nextLine();
compare.setTitre(titre); // вот мой временный объект 

Collections.sort(list);} // я не знаю нужна ли мне здесь коллекция


а вот моя функция которая сравнивает правда она выдает ошибку но я не знаю почему и не знаю как вызвать эту функцию из функции findFilm(); пыталась вызвать напрямую Eclipse требует переделать ее в static если переделываю то Comparable ругается

Код
public int compareTo(Film f) {
String com = Gestion.compare.getTitre();
if (Gestion.compare.getTitre()== com) return this.titre.compareTo(f.getTitre());
if (Gestion.compare.getRealisat()==com)return this.realisateur.compareTo(f.getRealisat());
if (Gestion.compare.getCategorie()==com)return this.categorie.compareTo(f.getCategorie());
throw new IllegalStateException("Unknown compareBy.");
}


Помогите пожалуйста разобраться

Это сообщение отредактировал(а) natika - 28.3.2014, 16:36
PM MAIL   Вверх
MarkHunt
Дата 28.3.2014, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 7.3.2013

Репутация: нет
Всего: нет



Чтобы Eclipse не ругался, нужно убрать из метода findFilm слово static. А вообще вы пытаетесь сделать сортировку коллекции.
Чтобы сделать поиск нужно пройтись циклом по коллекции объектов Film и сравнивать введённое значение с названием фильма.
Примерно так:
Код

public Film findFilm(){
  Scanner saisie = new Scanner(System.in);
  System.out.println("что бы найти фильм по названию нажмите 1 по продюсеру 2 и по категории 3");
  int selection = Integer.parseInt(saisie.nextLine());
  if (selection == 1 ){
    System.out.println("Введите название фильма");
    String titre = saisie.nextLine();
    compare.setTitre(titre); // вот мой временный объект 
    for (Film film : list) {
      if (film.getTitre().equals(titre) {
        return film;
      }
    }
  } else {
    return null;
  }
}

PM MAIL   Вверх
LSD
Дата 28.3.2014, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. Код практически невозможно прочесть, он не отформатировал и не оформлен тегами [Код]
2. Если ты хочешь быстро искать по названию, категории и т.д., то тебе надо создать несколько сортированных массивов/коллекций по одной на каждое поле по которому надо искать. Вначале сортировать, а потом искать будет приблизительно в 2 раза долще, чем простой поиск перебором.
3. Ну и вообще хотелось бы услышать более детальное описание проблемы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
natika
Дата 28.3.2014, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Цитата(MarkHunt @ 28.3.2014,  12:09)
Чтобы Eclipse не ругался, нужно убрать из метода findFilm слово static. А вообще вы пытаетесь сделать сортировку коллекции.
Чтобы сделать поиск нужно пройтись циклом по коллекции объектов Film и сравнивать введённое значение с названием фильма.
Примерно так:
Код

public Film findFilm(){
  Scanner saisie = new Scanner(System.in);
  System.out.println("что бы найти фильм по названию нажмите 1 по продюсеру 2 и по категории 3");
  int selection = Integer.parseInt(saisie.nextLine());
  if (selection == 1 ){
    System.out.println("Введите название фильма");
    String titre = saisie.nextLine();
    compare.setTitre(titre); // вот мой временный объект 
    for (Film film : list) {
      if (film.getTitre().equals(titre) {
        return film;
      }
    }
  } else {
    return null;
  }
}

Мне нужно именно Comparable использовать и я не знаю как с помощью Comparable сравнить объект со String введенным из клавиатуры когда функция compareTo возвращает только 1, 0 и -1, и если я вызываю эту функцию из функции findFilm() которая находится в другом классе то Eclipse просит сделать compareTo static а Comparable при этом ругается
PM MAIL   Вверх
MarkHunt
Дата 28.3.2014, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 7.3.2013

Репутация: нет
Всего: нет



Если нужен именно Comparable, то класс, объекты которого сортируются, должен реализовывать этот интерфейс.
Пример:
Код

public class Movie implements Comparable<Movie> {

    public Movie(String title, int duration) {
        this.title = title;
        this.duration = duration;
    }

    private String title;
    private int duration;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }

    // Так реализуется метод интерфейса Comparable
    // Если возвращается < 0, то текущий объект "меньше" того, который был передан параметром в метод
    // если 0, то равны, и > 0 - значит больше
    @Override
    public int compareTo(Movie other) {
        int cmp = title.compareToIgnoreCase(other.title);
        if (cmp != 0) {
            return cmp;
        }
        if (duration < other.duration) {
            cmp = -1;
        } else if (duration == other.duration) {
            cmp = 0;
        } else {
            cmp = 1;
        }
        return cmp;
    }

    @Override
    public String toString() {
        return "Movie {title: " + title + ", duration: " + duration + "}";
    }
}



Пример использования:
Код

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        // Создаём коллекцию фильмов
        Movie movie1 = new Movie("c", 20);
        Movie movie2 = new Movie("a", 15);
        Movie movie3 = new Movie("b", 10);

        ArrayList<Movie> movies = new ArrayList<Movie>();
        movies.add(movie1);
        movies.add(movie2);
        movies.add(movie3);

        System.out.println("Movies list before sorting:");
        for (Movie movie : movies) {
            System.out.println(movie);
        }

        System.out.println();

        // Сортируем...
        Collections.sort(movies);

        System.out.println("Movies list after sorting:");
        for (Movie movie : movies) {
            System.out.println(movie);
        }

        // Спрашиваем параметры нужного фильма
        Scanner scanner = new Scanner(System.in);
        System.out.println();
        System.out.println("Please, input movie title:");
        String desiredTitle = scanner.nextLine();
        System.out.println("Please, input movie duration:");
        int desiredDuration = scanner.nextInt();

        Movie desiredMovie = new Movie(desiredTitle, desiredDuration);

        // Поиск фильма... Можно было сделать вручную обычным циклом,
        // а можно воспользоваться методом binarySearch (работает только на отсортированных массивах и коллекциях)
        int pos = Collections.binarySearch(movies, desiredMovie);
        if (pos > -1 && pos < movies.size()) {
            System.out.println();
            System.out.println("Found movie: " + movies.get(pos));
        } else {
            System.out.println();
            System.out.println("Movie not found");
        }
    }

}



Это сообщение отредактировал(а) MarkHunt - 28.3.2014, 18:21
PM MAIL   Вверх
natika
Дата 28.3.2014, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Спасибо!! А скажите пожалуйста  int cmp = title.compareToIgnoreCase(other.title) первая title относится к desiredMovie?
PM MAIL   Вверх
natika
Дата 29.3.2014, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Добрый день я немного поменяла Ваш код потому что мне нужно сравнить фильм либо по названию либо по реализатору либо по категории и вот что у меня получилось


Код
public int compareTo(Films other) { 
          {
             
         
             int cmp = titre.compareToIgnoreCase(other.titre);
              if (cmp != 0) { if (realisat == other.realisat) cmp = 0; 
                                if (categorie == other.categorie) cmp = 0;
                    return cmp;
                 }
                  if (titre != other.titre) {
                   cmp = -1;
                   } else if (titre == other.titre) {
                   cmp = 0;
              } else {
                   cmp = 1;
              }
                return cmp;
              }}}



Код
public class Main {
   
 public static void main(String[] args) {

Scanner saisie = new Scanner(System.in);
                           System.out.println();
                           System.out.println("что бы найти фильм по названию нажмите 1, по реализатору 2, по категории 3 ");
                           int selection = saisie.nextInt();
                           saisie.nextLine();
                       if (selection == 1 ){
                    
                      System.out.println("Введите название");
                           String desiredTitle = saisie.nextLine();
                           Films comp = new Films(nom, nom, nom);
                           comp.setTitre(desiredTitle);
                            Collections.sort(inventaire_films);
                             System.out.println(Collections.binarySearch(inventaire_films, comp));
                             int pos = Collections.binarySearch(inventaire_films, comp);
                        
                           if (pos > -1 && pos < inventaire_films.size()) {
                               System.out.println();
                               System.out.println("Found movie: " + inventaire_films.get(pos));
                           } else {
                               System.out.println();
                               System.out.println("Movie not found");
                           }
                       }
                       }
                            
 


но он у меня почему то не сортирует а выдает ошибку NullPointerException на строку   int cmp = titre.compareToIgnoreCase(other.titre);

PM MAIL   Вверх
MarkHunt
Дата 29.3.2014, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 7.3.2013

Репутация: нет
Всего: нет



Цитата(natika @  29.3.2014,  00:33 Найти цитируемый пост)
NullPointerException

скорее всего из-за того, что не все поля класса Films инициализированы.
Так работает:
Код

public class Films implements Comparable<Films> {

    public Films(String titre, String realisat, String categorie) {
        this.titre = titre;
        this.realisat = realisat;
        this.categorie = categorie;
    }

    private String titre;
    private String realisat;
    private String categorie;

    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }

    public String getRealisat() {
        return realisat;
    }

    public void setRealisat(String realisat) {
        this.realisat = realisat;
    }

    public String getCategorie() {
        return categorie;
    }

    public void setCategorie(String categorie) {
        this.categorie = categorie;
    }

    @Override
    public int compareTo(Films other) {
        int cmp = titre.compareToIgnoreCase(other.titre);
        if (cmp != 0) {
            return cmp;
        }
        cmp = realisat.compareToIgnoreCase(other.realisat);
        if (cmp != 0) {
            return cmp;
        }
        return categorie.compareToIgnoreCase(other.categorie);
    }

    @Override
    public String toString() {
        return "Films {titre: " + titre + ", realisat: " + realisat + ", categorie: " + categorie + "}";
    }
}


Код

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner saisie = new Scanner(System.in);
        System.out.println();
        System.out.println("что бы найти фильм по названию нажмите 1, по реализатору 2, по категории 3 ");
        int selection = saisie.nextInt();
        saisie.nextLine();
        if (selection == 1) {
            // Допустим у нас есть уже какая-то коллекция с фильмами
            Films films1 = new Films("c", "c", "c");
            Films films2 = new Films("a", "a", "a");
            Films films3 = new Films("b", "b", "b");
            ArrayList<Films> inventaire_films = new ArrayList<Films>();
            inventaire_films.add(films1);
            inventaire_films.add(films2);
            inventaire_films.add(films3);

            // Теперь делаем поиск по коллекции
            System.out.println("Введите название");
            String desiredTitle = saisie.nextLine();
            Films comp = new Films(desiredTitle, desiredTitle, desiredTitle);

            Collections.sort(inventaire_films);

            int pos = Collections.binarySearch(inventaire_films, comp);

            if (pos > -1 && pos < inventaire_films.size()) {
                System.out.println();
                System.out.println("Found movie: " + inventaire_films.get(pos));
            } else {
                System.out.println();
                System.out.println("Films not found");
            }
        }
    }
}


По поводу этого
Цитата(natika @  29.3.2014,  00:33 Найти цитируемый пост)
мне нужно сравнить фильм либо по названию либо по реализатору либо по категории


LSD предлагал вариант
Цитата(LSD @  28.3.2014,  12:37 Найти цитируемый пост)
2. Если ты хочешь быстро искать по названию, категории и т.д., то тебе надо создать несколько сортированных массивов/коллекций по одной на каждое поле по которому надо искать.

но я честно говоря не догадываюсь как это сделать, т.к. compareTo только один раз реализуется, и в нём уже задано первое поле titre. А вот как сделать, чтобы по другим полям был поиск незнаю  smile 
PM MAIL   Вверх
natika
Дата 29.3.2014, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Спасибо Вам большое, я сделала как у Вас а он ошибку выдает вот эту 


Exception in thread "main" java.lang.NullPointerException    
    at Films.compareTo(Films.java:95)                       вот здесь  int cmp = titre.compareToIgnoreCase(other.titre);
    at Films.compareTo(Films.java:1)          это тут   import java.util.ArrayList;           
    at java.util.Collections.indexedBinarySearch(Unknown Source)
    at java.util.Collections.binarySearch(Unknown Source)
    
PM MAIL   Вверх
MarkHunt
Дата 29.3.2014, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 7.3.2013

Репутация: нет
Всего: нет



приведите полный код этих классов
PM MAIL   Вверх
natika
Дата 29.3.2014, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2014

Репутация: нет
Всего: нет



Цитата(MarkHunt @ 29.3.2014,  07:46)
приведите полный код этих классов

Спасибо Вам большое за помощь я решила без Comparable сравнить объекты потому что совсем времени уже нет, все равно он у меня не получается наверное потому что у меня там 12 классов и код очень большой. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.