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


Автор: Pawl 28.12.2011, 20:48
Уважаемые форумчане,
сейчас промозглый, сырой, зябкий и отнюдь не зимний (несмотря на календарь) вечер среды. В такую погоду хорошо сидеть перед горящим камином, укрывшись теплым шерстяным пледом и потягивать выдержанное шотландское виски...
Но, поскольку у меня ничего этого нету, решил заняться программированием 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.
Спасибо!

Автор: priam220 28.12.2011, 21:50
что больше 8/5 или  6/4 ? )

Автор: Pawl 28.12.2011, 21:53
Цитата(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

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

Автор: priam220 28.12.2011, 22:29
Код

        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;
    }};

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

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

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