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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Comparable Comparator, как его правильно курить? 
:(
    Опции темы
Rauko
Дата 16.8.2015, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть задача:
программа должна обрабатывать определенный массив данных(имена-фамилии, зарплаты, идентификационный номер). через интерфейсы реализовать сортировки по фамилии, зарплате, номеру в базе данных
написала классы, описывающих моих тружеников в базе, все загружается-выгружается как часы...
собственно вопрос - как правильно использовать для этой задачи интерфейс Comparable?
эклипс предлагает такую конструкцию, но как ее правильно вкурить - не понимаю...
Код

    public int compareTo(Object obj) {
        return 0;
    }

собственно, как сравнить по определенному полю класса(через геттер)?
данные имеют типы:
salary - double
name - String
INN - int
как все это дело правильно обработать?

__________________________
дополнительно вопрос по эклипсу - почему может быть проблема с псевдографикой?
в коде имею одно, в консоле - другое...
код:
Код

System.out.println(
                "╔════╦═══════════════════════════════╦════════════════════════════════════════════╗"
            + "\n║    ║           Employee            ║               ^  Salary                    ║"
            + "\n║  № ╟───────────────┬───────────────╫──────────────┬─────────────┬───────────────╢"
            + "\n║    ║      Name     │    Surname    ║ Basic Salary │    Bonus    │   * Total     ║"
            + "\n╠════╬═══════════════╪═══════════════╬══════════════╪═════════════╪═══════════════╣");

консоль:
Код

???????????????????????????????????????????????????????????????????????????????????
?    ?           Employee            ?               ^  Salary                    ?
?  № ??????????????????????????????????????????????????????????????????????????????
?    ?      Name     ?    Surname    ? Basic Salary ?    Bonus    ?   * Total     ?
???????????????????????????????????????????????????????????????????????????????????


как его поправить? чем может быть вызвано? раньше нормально отрисовывал таблички.....

Это сообщение отредактировал(а) Rauko - 16.8.2015, 18:44
PM MAIL   Вверх
AntonSaburov
Дата 17.8.2015, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Comparable позволяет сделать объекты одного класса сравнимыми (через интерфейс Comparable) - compareTo возвращает
> 0 - текущий объект больше, чем тот, который передали
= 0 - объекты равны
< 0 - переданный объект больше.

Лучше сделать описание класса для сравнения типизированным (с Generic)
Код

public class Employee implements Comparable<Employee>
{
}


Тогда  будет так 
Код

public int compareTo(Employee obj) {
    return 0;
}


Ну а как сравнивать - тут самому надо решать. Если только по фамилии, то тогда name.compareTo(obj.name)
PM MAIL WWW ICQ   Вверх
Rauko
Дата 17.8.2015, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в общем, у меня получилось только с даблом решить:
Код

     public int compare(Employee e1, Employee e2){
          if (e1.getSalary() > e2.getSalary()) 
              return -1;
          if (e1.getSalary() < e2.getSalary()) 
              return 1;
          return 0;
    }


подскажите, как решить сортировку с INN и secondName?

не могу разобраться, как задать критерий сравнения...

Это сообщение отредактировал(а) Rauko - 17.8.2015, 11:30
PM MAIL   Вверх
AntonSaburov
Дата 17.8.2015, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Так надо критерий сделать по всем трем полям ? Или надо сделать так, чтобы можно было выбирать, по какому полю делать сортировку ?
PM MAIL WWW ICQ   Вверх
Rauko
Дата 17.8.2015, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня это решено через выбор в меню варианта сравнения:
Код

    ...
System.out.print( "1. Sort by Salary.\n"
            + "2. Sort by Second Name.\n"
            + "3. Sort by INN.\n"
            + "\n"
            + "Choose mode: ");
    ...
}

 
задача подразумевает вызов нужного метода для нужной сортировки базы данных в 10 элементов (Employee[] dataBase) разных классов(дочерние классы Employee c разницей в вычислении некоторых полей и несколькими различающимися константными переменными). мне показалось, что будет удобней вызывать через менюшку нужное условие, по факту ограничений в задаче не было

единственное, с чем у меня проблема - это собственно сортировка... не могу понять, как ее выполнять(до коллекций пока еще не дошли в изучении, пока был только Comparable Comparator)

в каждом из используемых классов есть поля:
 - Name(2 отдельные переменные типа String);
 - Salary(3 переменные типа  double: сама зп, бонус в численном виде в зависимости от %, полная зп);
 - INN(int, номер регистрации в системе);
 - куча других параметров, которые не относятся к данной задаче.
 
сложность заключается в том, что я упорно не пойму, как менять поле, по которому выполнять сортировку... 

Это сообщение отредактировал(а) Rauko - 17.8.2015, 13:13
PM MAIL   Вверх
AntonSaburov
Дата 17.8.2015, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



А точно надо сортировать через Comparable ? Просто он унжен тогда, когда используется коллекция. Если сортировать надо самому, то нафига он вообще нужен.

Если же используются коллекции, то может тогда лучше использовать интерфейс Comparator в котором реализовать compare(Object obj1, Object obj2)
Сделать что-то подобное такому

Код

import java.util.Comparator;

public class EmployeeComparator implements Comparator<Employee>
{
    private int mode = 0;
    
    public EmployeeComparator(int mode) {
        this.mode = mode;
    }
    
    @Override
    public int compare(Employee t, Employee t1) {
        int result = 0;
        switch(mode) {
            case 0 : // Здесь сравниваем по имени result = ....
            case 1 : // Здесь сравниваем по ИНН result = ....
            case 2 : // Здесь сравниваем по доходу result = ....
        }
        
        return result;
    }
}


И использовать так:
Код

Collections.sort(<Список сотрудников>, new EmployeeComparator(<нужный режим сравнения>));

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


Шустрый
*


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

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



ну, это тема перед коллекциями...

перенесла меню в класс, отвечающий за вывод на экран...
ругается, однако

    
Код

public int compare(Employee e1, Employee e2){
        switch(task) {
            case 1 : {
                if (e1.getSalary() > e2.getSalary()) 
                    return -1;
                if (e1.getSalary() < e2.getSalary()) 
                    return 1;
                return 0;
            }
            case 2 : {
                if (e1.getSecondName() > e2.getSecondName()) 
                    return -1;
                if (e1.getSecondName() < e2.getSecondName()) 
                    return 1;
                return 0;
            }
            default : {
                if (e1.getINN() > e2.getINN()) 
                    return -1;
                if (e1.getINN() < e2.getINN()) 
                    return 1;
                return 0;
            }
        }
    }


в частности, компилятору не нравится вот это место:
Код

    case 2 : {
        if (e1.getSecondName() > e2.getSecondName()) 
            return -1;
        if (e1.getSecondName() < e2.getSecondName()) 
            return 1;
        return 0;
    }

причина: Оператор > не определен для типов параметров java.lang.String, java.lang.String

на INN не ругается...

коллекцию не использовала, не по теме финт ушами

Это сообщение отредактировал(а) Rauko - 17.8.2015, 16:05
PM MAIL   Вверх
AntonSaburov
Дата 17.8.2015, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Класс String является Comparable - используйте 
Код

return e1.getName().compareTo(e2.getName());


И на будущее - для объектов не определены операции >, <, >=, <=. Там можно сравнить ссылки, но это не сравнение объектов, а сравнение ссылок - == или !=.
PM MAIL WWW ICQ   Вверх
Rauko
Дата 18.8.2015, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, большое спс, заработало )


теперь буду делать дз с коллекциями...(переписать прогу под коллекции)
PM MAIL   Вверх
Rauko
Дата 23.8.2015, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



такс, пришел ответ от преподавателя - задача решена не верно

в этой задаче не должен использоваться switch
вопрос - как тогда реализуется эта задача без свича? (именно момент с несколькими вариантами compare)

а так же - почему нельзя использовать вместе Comparable <> и Comparator <>:
Код

public class OutPut extends Employee implements ModeExec, Comparable <Object>, Comparator <Employee> {...}


Это сообщение отредактировал(а) Rauko - 23.8.2015, 18:15
PM MAIL   Вверх
AntonSaburov
Дата 24.8.2015, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Как я понимаю, нужно сделать задачу в которой есть массив (не коллекция, а массив) объектов класса Employee, который реализует интерфейс Comparable.
Нужно написать функцию, которая что делает ? Сравнивает Employee по группе полей как бы "одним куском" (т.е. в сравнении сразу частвуют все поля) или нужно иметь возможность выбирать по какому полю сравнивать ?

Для первого случая надо сделать одно, для второго - другое

Comparable позволяет получить ответ какой из двух объектов "больше" (или "меньше"). В общем можно сравнивать объекты в массиве через compareTo ну и дальше их сортровать.

Но точной формулировки задачи я не увидел, а придумывать ща Вас как-то не хочется. Вы уж постарайтесь ТОЧНО сформулировать, что надо.

PM MAIL WWW ICQ   Вверх
Rauko
Дата 24.8.2015, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, речь идет именно о массиве(!) элементов Employee, не коллекции

использовать интерфейс Comparable для трех разных запросов (получить сортировку по int INN, String фамилии, double зарплате)

не использовать switch как показано ниже:
Код

    public int compare(Employee e1, Employee e2){
        switch(task) {
            case 1 : {
                if (e1.getSalary() > e2.getSalary()) 
                    return -1;
                if (e1.getSalary() < e2.getSalary()) 
                    return 1;
                return 0;
            }
            case 2 : {
                int result = e1.getSecondName().compareTo(e2.getSecondName());
                if (result == 0){
                    result = e1.getFirstName().compareTo(e2.getFirstName());
                }
                return result;
            }
            default : {
                if (e1.getINN() > e2.getINN()) 
                    return 1;
                if (e1.getINN() < e2.getINN()) 
                    return -1;
                return 0;
            }
        }
    }


вроде как то так... ну и почему нельзя использовать вместе Comparable <> и Comparator <>?
PM MAIL   Вверх
AntonSaburov
Дата 24.8.2015, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Ну видимо Ваш преподаватель имеет свои планы.
Comparator требует работы с коллекцией. Comparable в принципе не требует - можн онаписать свой метод сортировки, который будет использовать compareTo для сравнения объектов и дальнейшего их перемещения в нужные места массива.
Например, для метода сравнения "пузырьком" надо сравнивать два соседних жлемента и менять их местами, если первый больше второго и сортировка от меньшего к большему. 
Но тут закавыка в том, что тогда сам класс Employee должен иметь какой-то признак, который позволит одному объекту сравниваться с другим объектом по разным полям.
Забавно то, что в этом случае switch как раз неплохо будет подходить. Но можнро обойтись конечно же и без него.

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

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

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


 




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


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

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