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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка List с помощью Collections.sort(), сортировка своих классов в списке 
V
    Опции темы
Pawl
Дата 28.12.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемые форумчане,
сейчас промозглый, сырой, зябкий и отнюдь не зимний (несмотря на календарь) вечер среды. В такую погоду хорошо сидеть перед горящим камином, укрывшись теплым шерстяным пледом и потягивать выдержанное шотландское виски...
Но, поскольку у меня ничего этого нету, решил заняться программированием smile. А т. к. все мысли витают вокруг камина и пр., очень быстро возник затуп  smile, в котором, собственно, и прошу Вас помочь мне разобраться.
Дело в следующем: запихиваю я в List некие объекты класса Item и хочу их там отсортировать как мне надо с пом. Collections и компаратора. Делаю я это так:
Код

import java.util.*;

public class Sort {
    private final int N = 5;
    private ArrayList<Item> items = new ArrayList<Item>(N);
    private Random rnd = new Random(1);
    
    private Comparator<Item> comparerItemMass = new Comparator<Item>() {
        public int compare (Item a, Item b) {
        if (a.price / a.mass > b.price / b.mass)
            return -1;

        if (a.price / a.mass < b.price / b.mass)
            return 1;

        return 0;
    }};    
    
    private class Item {
        private int mass;
        private int price;  

        public String toString() {
            return String.format("%s %d %8s %d", "Цена:", price, "Macca:", mass);
        }
    }
    
    public Sort() {
        for (int i = 0; i < N; i++) {
            Item item = new Item();
            item.mass = rnd.nextInt(10);
            item.price = rnd.nextInt(10);
            items.add(item);
        }        
        Collections.sort(items, comparerItemMass);
    }     

    public static void main(String[] args) {
     Sort z = new Sort();
        for (Item item : z.items) {
         System.out.println(item);
        }            
    }
}

Так вот, не сортируется! А когда я попытался таким же образом отсортировать в списке строки, у меня всё получилось:
Код

import java.util.*;

public class Sort1 {
    private final int N = 5;
    private ArrayList<String> items = new ArrayList<String>(N);
    
    private Comparator<String> comparerItemMass = new Comparator<String>() {
        public int compare (String a, String b) {
        if (a.length() > b.length())
            return -1;

        if (a.length() < b.length())
            return 1;

        return 0;
    }};    
    
    public Sort1() {
        items.add("aaa");
        items.add("oooo");
        items.add("uu");
        items.add("ee");
        items.add("sssssss");     
        Collections.sort(items, comparerItemMass);
    }     

    public static void main(String[] args) {
     Sort1 z = new Sort1();
        for (String item : z.items) {
         System.out.println(item);
        }            
    }
}

А теперь вопрос: почему объекты типа String сортируются, а мои - нет? Я думал реализовать в моём классе интерфейс Comparable:
Код

    private class Item implements Comparable<Item> {
        private int mass;
        private int price;
        
        public int compareTo(Item o) {
            if (price / mass > o.price / o.mass)
                return -1;
    
            if (price / mass < o.price / o.mass)
                return 1;
    
            return 0;            
        }     

        public String toString() {
            return String.format("%s %d %8s %d", "Цена:", price, "Macca:", mass);
        }
    }

но не помогло!
Пожалуйста, подскажите, в чем проблема! Я уже устал тупить, а ничего конструктивного мой мозг сегодня больше выдать не способен  smile.
Спасибо!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
priam220
Дата 28.12.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что больше 8/5 или  6/4 ? )
PM MAIL   Вверх
Pawl
Дата 28.12.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(priam220 @  28.12.2011,  21:50 Найти цитируемый пост)
что больше 8/5 или  6/4 ? )

конечно, 8/5, НО

Цена: 8   Macca: 5
Цена: 4   Macca: 4
Цена: 6   Macca: 4
Цена: 8   Macca: 8
Цена: 3   Macca: 7

это - явно не та сортировка, что мне надо!

По идее, должно быть так:

Цена: 8   Macca: 5
Цена: 6   Macca: 4
Цена: 8   Macca: 8
Цена: 4   Macca: 4
Цена: 3   Macca: 7


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Pawl
Дата 28.12.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все, блин, разобрался!
Действительно был затуп: сделал mass и price типа double и всё заработало!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
priam220
Дата 28.12.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

        public int compare (Item a, Item b) {
        if (a.price/a.mass > b.price/b.mass)
            return -1;
        if (a.price/a.mass < b.price/b.mass)
            return 1;
         if (a.price%a.mass > b.price%b.mass)
         return -1;
          if (a.price%a.mass < b.price%b.mass)
         return 1;
          if (a.price > b.price)
          return -1;
            if (a.price < b.price)
          return 1;
        return 0;
    }};

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


Опытный
**


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

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



Цитата(priam220 @  28.12.2011,  22:29 Найти цитируемый пост)
код Java

Спасибо, так и стипом int, похоже, нормально работать будет!


--------------------
В действительности всё совсем не так, как на самом деле
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.1055 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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