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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортирование ArrayList по опред столбцу 
V
    Опции темы
Evgeni
Дата 21.11.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет, есть лист такого вида 

[  value1, 248, 112000, 451.61]
[  value2, 239, 96000,  401.67]
[  value3, 243, 1950000, 405.99]

нужно отсортировать его, по 3 столбцу в порядке убывания, как это сделать?


PM MAIL   Вверх
YuG
Дата 21.11.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Читаешь api, создаешь свой компаратор и вперед.

Comparator
Collections.sort(java.util.List, java.util.Comparator)

Короче, не получается дать точную ссылку на метод Collections.sort(java.util.List, java.util.Comparator) из-за пробела в урле.

Это сообщение отредактировал(а) YuG - 21.11.2006, 14:45
PM WWW ICQ Skype   Вверх
hovex
Дата 21.11.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну если нету времени читать.
то прост по очередно возми все  третие елементы, и с помошю класса Integer достань integer.intValue()  значении етих полей,а потом делай сортировку например с помошю пузыркого алгоритма, но не забывай во времия перемешения елементов, переместить вес запись, а не толко тот по которому делаеш сортировку.  
PM MAIL   Вверх
Bulat
Дата 21.11.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Evgeni, чуть более шире выложил бы задачу, более четкоотписал бы, а так, допустим можно для сортировки:
есть экземпляр класса:
Код

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

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

    public Integer getRecordId() {
        return recordId;
    }

    public Double getCost() {
        return сost;
    }

    public Double getSumCost() {
        return sumCost;
    }

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

    public void setCost(Double cost) {
        сost = cost;
    }

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

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

}


и там где ты будешь это использовать:
Код

...
    public LoginsData[] getLogins_data() throws IllegalAccessException, SQLException, InstantiationException, ClassNotFoundException, IOException {
...
    LoginsData element = new LoginsData(recordBuff, balanceBuff, sumCostBuff);
    Ldata.add(element);
...
        return (LoginsData[]) Ldata.toArray(new LoginsData[Ldata.size()]);
    }

    public void UpdateLogins() throws SQLException, IllegalAccessException, ClassNotFoundException, InstantiationException, IOException {
        LoginsData[] LdArray = getLogins_data();
        Arrays.sort(LdArray);
...
    }


соотв. фишка в Arrays.sort(LdArray), но это один из способов smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Evgeni
Дата 21.11.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да я собственно пытался сделать как hovex говорит, но не могу заполнить массив
вообще с массивами не работал, я пробовал так :

Код

int[] array = new int[sourceList.size()];

for(int i = 0; i<sourceList.size(); i++){
    String rowList = (String)sourceList.get(i);
    int element = Integer.parseInt((String)rowList.get(2));
    
    Arrays.fill(array, element);
}


но выдает ерунду

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


карманная тигра
***


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

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



Цитата(Evgeni @  21.11.2006,  16:12 Найти цитируемый пост)
да я собственно пытался сделать как hovex говорит, но не могу заполнить массив
вообще с массивами не работал, я пробовал так :

Зачем? Напиши свой компаратор, в нём напиши сравнение по третьему столбцу - и запихивай в коллекции, сортируй на здоровье.


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Evgeni
Дата 21.11.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



chief39, я не понимаю как писать компаратор, для меня это пожалуй слишком сложно
PM MAIL   Вверх
LSD
Дата 21.11.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код
public class SomeData
{
  private int id;
  private String name;
  private double value;

  public SomeData(int id, String name, double value)
  {
    this.id = id;
    this.name = name;
    this.value = value;
  }

  public int getId()
  {
    return id;
  }

  public void setId(int id)
  {
    this.id = id;
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public double getValue()
  {
    return value;
  }

  public void setValue(double value)
  {
    this.value = value;
  }

  public boolean equals(Object o)
  {
    if(this == o)
      return true;
    if(o == null || getClass() != o.getClass())
      return false;

    SomeData that = (SomeData) o;

    if(id != that.id)
      return false;
    if(Double.compare(that.value, value) != 0)
      return false;

    return !(name != null ? !name.equals(that.name) : that.name != null);
  }

  public int hashCode()
  {
    int result = id;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    long temp = value != +0.0d ? Double.doubleToLongBits(value) : 0L;
    result = 31 * result + (int) (temp ^ (temp >>> 32));
    return result;
  }
}

public class SomeDataComparator implements Comparator
{
  public int compare(Object o1, Object o2)
  {
    SomeData l1 = (SomeData) o1;
    SomeData l2 = (SomeData) o2;
    return Double.compare(l1.getValue(), l2.getValue());
  }
}

А затем уже Arrays.sort().


--------------------
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   Вверх
Evgeni
Дата 22.11.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хы, спасибо всем кто откликнулся!
я сделал так: 

Код

List<Double> tempList = new ArrayList<Double>();
...
for(int i < 0; i<sourceList.size(); i++){
      ArrayList rowList = (ArrayList)sourceList.get(i);
      Double element = Double.parseDouble((String)rowList.get(2));
      tempList.add(element);
}
...
Collections.sort(tempList);
...

дальше просто прокрутил отсортированый tempList и нашел совпавшие элементы.
 
вообще по заданию пользователь должен выбрать по какой строке делать поиск, поэтому тип double.

Наверное не самый лучший вариант, но мне как начинающему, он показался очень простым smile 
PM MAIL   Вверх
Stampede
Дата 22.11.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(Evgeni @  21.11.2006,  16:42 Найти цитируемый пост)
Наверное не самый лучший вариант, но мне как начинающему, он показался очень простым smile

То, что не лучший - это уж точно smile
  • Во-первых, ты создаешь вспомогательный список, без которого вполне можно было бы обойтись, то есть кушаешь память.
  • Во-вторых, сортировка превращается у тебя в достаточно длинный кусок кода, который к тому же не универсален. То есть если тебе захочется отсортировать по другому полю (особенно если оно не типа double), то тебе придется практически дублировать функцию сортировки - со всеми вытекающими негативными последствиями.
  • В-третьих, и пожалуй самых важных, твоя логика сортировки исходит из предположения, что значения нужного поля - ненулевые и уникальные. А что если впоследствии эта посылка окажется неверной?
От всех этих недостатков на самом деле легко избавиться, если применить стандартный встроенный механизм сортировки, о котором тебе тут уже не раз говорили. Если мнение форумчан для тебя не авторитет, то послушай хотя бы, что говорит по этому поводу признанный гуру программирования Josh Bloch в книжке Effective Java. К твоему случаю применимы сразу два совета (перевод мой smile):
  • Совет 11: Не ленись задавать порядок сортировки (Consider implementing Comparable)
  • Совет 30: Знай и люби данную тебе библиотеку, мать твою! (Know and use the libraries)
Не знаю, что тебе показалось сложным, но на самом деле идея Comparable совершенно проста. Вот у тебя есть какой-то свой тип. В большинстве случаев мы можем представить себе какой-то критерий, по которому объекты этого типа будут упорялочиваться при выводе в виде списка. алфавитный порядок, числовой, временной или какой-то еще. Для таких типов Java API предлагает контракт: объявите, что ваш класс реализует интерфейс Comparable, и мы предоставим вам готовые удобные методы сортировки. Все, что вам для этого нужно - это рассказать, в форме запрограммированного алгоритма, как один объект вашего типа будет сравниваться с другими. То есть вы должны написать реализацию одного-единственного метода, требующегося согласно контракта, задаваемого интерфейсом Comparable, а именно public int compareTo(Object obj).

Как написать метод - смотри, например, код Bulat'а.

Таким образом, интерфейс Comparable (вернее, его реализация) задает естественный умолчальный порядок сортировки объектов данного типа. Если же нам нужно отсортировать по какому-то произвольному критерию, как в твоем случае, когда данные представлены списками значений (это, кстати, обязательное условие? может все-таки задать свой тип?), то для этого в Java предусмотрен еще один способ - интерфейс Comparator. Это, опять-таки, очень простой интерфейс. Предоставляя объект типа Comparator с зашитым внутри алгоритмом сравнения двух объектов известного типа, в форме метода  public int compare(Object obj1, Object obj2), мы задаем порядок, который далее может быть использован в штатных операциях сортирвки.

Как реализовать решение с компаратором - см. код LSD. Только одна маленькая поправочка: вызывать надо метод Collections.sort(List list, Comparator comparator).

ЗЫ. Если кого заинтересовала книжка Effective Java, я выложил ее вот сюда: формат PDF, 2.7 MB. Но это совсем не для начального ознакомления.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
JVM
Дата 27.9.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Stampede @  22.11.2006,  22:11 Найти цитируемый пост)
Таким образом, интерфейс Comparable (вернее, его реализация) задает естественный умолчальный порядок сортировки объектов данного типа. Если же нам нужно отсортировать по какому-то произвольному критерию, как в твоем случае, когда данные представлены списками значений (это, кстати, обязательное условие? может все-таки задать свой тип?), то для этого в Java предусмотрен еще один способ - интерфейс Comparator. Это, опять-таки, очень простой интерфейс. Предоставляя объект типа Comparator с зашитым внутри алгоритмом сравнения двух объектов известного типа, в форме метода  public int compare(Object obj1, Object obj2), мы задаем порядок, который далее может быть использован в штатных операциях сортирвки.


Можно поподробнее? Так и не понял в чем разница между Comparable и Comparator.
Что означает "задает естественный умолчальный порядок сортировки"? Ведь как реализуешь метод compareTo() так и будет происходить сортировка.
PM MAIL   Вверх
chief39
Дата 27.9.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Цитата(JVM @  27.9.2007,  13:13 Найти цитируемый пост)
Comparable

"То, что можно сортировать"

Цитата(JVM @  27.9.2007,  13:13 Найти цитируемый пост)
Comparator

"То, что сортирует"

Если любой ребёнок может сортировать шарики по размеру, то любой ребёнок - Компаратор, а люобй шарик, который можно сортировать - Компарэйбл


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

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

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

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


 




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


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

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