Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > как применить sort


Автор: Bulat 22.5.2006, 16:16
У меня есть список:
Код
    public Logins_data[] getLogins_data() throws IllegalAccessException, SQLException, InstantiationException, ClassNotFoundException {
        List Ldata = new ArrayList();
...
        Logins_data element = new Logins_data(record_buff, sum_cost_buff);
        Ldata.add(element);
        return (Logins_data[]) Ldata.toArray(new Logins_data[Ldata.size()]);
    }


Код
public class Logins_data {
    Integer record_id;
    Double sum_cost;

    public Logins_data(Integer record_id, Double sum_cost) {
        this.record_id = record_id;
        this.sum_cost = sum_cost;
    }

    public Integer getRecord_id() {
        return record_id;
    }

    public Double getSum_cost() {
        return sum_cost;
    }

    public void setRecord_id(Integer record_id) {
        this.record_id = record_id;
    }

    public void setSum_cost(Double sum_cost) {
        this.sum_cost = sum_cost;
    }
}


Есть необходимость упорядочить этот список по полю record_id. Но никак не соображу как это сделать, уж извините за тривиальный вопрос, но в учебнике используются настолько простые примеры....

Я так понимаю что-то связанное с Comparator, можно и про него по подробнее. 

Автор: UnicornMirage 22.5.2006, 16:23
Код

public class Logins_data implements Comparable {
    Integer record_id;
    Double sum_cost;
    public Logins_data(Integer record_id, Double sum_cost) {
        this.record_id = record_id;
        this.sum_cost = sum_cost;
    }
    public Integer getRecord_id() {
        return record_id;
    }
    public Double getSum_cost() {
        return sum_cost;
    }
    public void setRecord_id(Integer record_id) {
        this.record_id = record_id;
    }
    public void setSum_cost(Double sum_cost) {
        this.sum_cost = sum_cost;
    }


    /**
     * метод сравнения
     */
    public int compareTo(Object obj) {
           if(obj instanceof Logins_data) {
                  return record_id.compareTo( ((Logins_data) obj).getRecord_id()  );
           } else {
                  return -1;
           }

    }
}


после этого можно сортировать массив
Код

Logins_data[] a = ...;

Arrays.sort(a);
  

Автор: Bulat 22.5.2006, 16:58
Не сочтите за.....
Но хотелось бы конкретно что должно быть на месте Object obj, конкретно в моем случае. 

Автор: UnicornMirage 22.5.2006, 17:44
сорри, я сделал описку smile
вместо Integer нужно разумеется Logins_data, листинг исправил выше 

Автор: LSD 22.5.2006, 21:32
Цитата(UnicornMirage @  22.5.2006,  18:44 Найти цитируемый пост)
вместо Integer нужно разумеется Logins_data, листинг исправил выше

И метод compareTo() должен выкидывать ClassCastException, а не возвращать -1. 

Автор: UnicornMirage 22.5.2006, 21:43
тогда instanceof можно вообще не делать? 

Автор: LSD 22.5.2006, 22:46
Цитата(UnicornMirage @  22.5.2006,  22:43 Найти цитируемый пост)
тогда instanceof можно вообще не делать?

Да. 

Автор: jimur 23.5.2006, 07:24
Если используется 1.5, то лучше так:
Код

public class LoginsData implements Comparable<LoginsData> {
    private Integer recordId;
    private Double sumCost;

    public LoginsData(final Integer recordId, final Double sumCost) {
        this.recordId = recordId;
        this.sumCost = sumCost;
    }

    public Integer getRecordId() {
        return recordId;
    }

    public Double getSumCost() {
        return sumCost;
    }

    public void setRecordId(final Integer recordId) {
        this.recordId = recordId;
    }

    public void setSumCost(final Double sumCost) {
        this.sumCost = sumCost;
    }

    /**
     * метод сравнения
     */
    public int compareTo(final LoginsData loginsData) {
        return recordId.compareTo(loginsData.recordId);
    }
}

И стиль я немного поправил, а то душа кровью обливалась smile 

Автор: Bulat 23.5.2006, 08:01
Цитата(jimur @ 23.5.2006,  07:24)
Если используется 1.5, то лучше так:
Код

public class LoginsData implements Comparable<LoginsData> {
    private Integer recordId;
    private Double sumCost;

    public LoginsData(final Integer recordId, final Double sumCost) {
        this.recordId = recordId;
        this.sumCost = sumCost;
    }

    public Integer getRecordId() {
        return recordId;
    }

    public Double getSumCost() {
        return sumCost;
    }

    public void setRecordId(final Integer recordId) {
        this.recordId = recordId;
    }

    public void setSumCost(final Double sumCost) {
        this.sumCost = sumCost;
    }

    /**
     * метод сравнения
     */
    public int compareTo(final LoginsData loginsData) {
        return recordId.compareTo(loginsData.recordId);
    }
}

И стиль я немного поправил, а то душа кровью обливалась smile

Супер, вот тебе точно стоит тыкнуть, надеюсь админы учтут, ибо сам пока не могу. Кстати можешь еще небольшой комментарий к этому compareTo, дабы у меня есть еще классы, где применив подобную ерунду, я мог бы значительно упростить свой код.

Добавлено @ 08:10 
И кстати, раз уж речь зашла о стиле, тогда такой момент, мне пришлось убрать public когда я объявляю свой класс LoginsData. Это нормальная реакция IDEA, что он на него ругается? 

Автор: jimur 23.5.2006, 09:49
Цитата(Bulat @  23.5.2006,  08:01 Найти цитируемый пост)
Кстати можешь еще небольшой комментарий к этому compareTo, дабы у меня есть еще классы, где применив подобную ерунду, я мог бы значительно упростить свой код. 

А что здесь комментировать, если ты про темплейты, 
то для начала можно сюда: http://www.optim.su/cs/2004/3/Generics/Generics.asp
дальше лучше search://java+generics

Цитата(Bulat @  23.5.2006,  08:01 Найти цитируемый пост)

И кстати, раз уж речь зашла о стиле, тогда такой момент, мне пришлось убрать public когда я объявляю свой класс LoginsData. Это нормальная реакция IDEA, что он на него ругается? 

Наверное ты этот класс в один файл с другим запихать пытаешся

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)