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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка в ArrayList 
:(
    Опции темы
jonajo
Дата 1.4.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задали задачу ,переделать алгоритм сортирования массива в сортирование в ArrayList.
Код

public void bubblesort (ArrayList<Integer>  c,int n )
{
for (int i=0;i<n-1;i++){
  for(int j =0;j<n-1;j++)
  if (c.get(j)>c.get(j+1)){
      int tmp=c.get(j);
     set(tmp,c.get(j+1));
     set(c.get(j+1),c.get(j));
      c.get(j+1)=tmp;
 
}}
 
}



проблема,что я что-то неправильно пишу в метод set.
Ошибка cannot find symbol - method set(java.lang.Integer,java.lang.Integer).
Я поняла,что вроде как неправильные параметры.
Помогите правильно написать,пожалуйста 
PM MAIL   Вверх
Zoiberg
Дата 1.4.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.8.2008
Где: Ukraine, Kiev

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



Как я понимаю, сортировать надо ту коллекцию которая в параметрах метода bubblesort передается. А вы вызываете метод set не для нее. Если это да, то будьте внимательны в дальнейшем.  
PM MAIL   Вверх
jonajo
Дата 1.4.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Zoiberg @ 1.4.2010,  00:16)
Как я понимаю, сортировать надо ту коллекцию которая в параметрах метода bubblesort передается. А вы вызываете метод set не для нее. Если это да, то будьте внимательны в дальнейшем.

Цитата

А вы вызываете метод set не для нее.


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


Опытный
**


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

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



Pусским же по-белому написано
Цитата("jonajo")
Ошибка cannot find symbol - method set(java.lang.Integer,java.lang.Integer).

Что неудивительно в свете 
Цитата("jonajo")
Код
set(c.get(j+1),c.get(j));
.

Коллекции не умеют хранить примитивы.
PM   Вверх
batigoal
Дата 1.4.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(aleksandy @  1.4.2010,  06:01 Найти цитируемый пост)
Коллекции не умеют хранить примитивы. 

? Давным-давно уже умеют.

Добавлено через 1 минуту и 5 секунд
Что за метод set, вообще? Приведите код класса целиком.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
MaxPayneC
Дата 1.4.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(batigoal @  1.4.2010,  08:26 Найти цитируемый пост)
? Давным-давно уже умеют.

Коллекции не умеют хранить не-наследников Object. Я полагаю, вы имели в виду autoboxing.


Цитата(jonajo @  1.4.2010,  00:05 Найти цитируемый пост)
проблема,что я что-то неправильно пишу в метод set.
Ошибка cannot find symbol - method set(java.lang.Integer,java.lang.Integer).

Цитата

java.util.ArrayList
public E set(int index,
             E element)
Replaces the element at the specified position in this list with the specified element.


То есть, во-первых, вызывать метод у коллекции (c.set(...)), а во-вторых, первым аргументом передавать индекс заменяемого значения.
PM   Вверх
Kangaroo
Дата 1.4.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

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



Цитата(aleksandy @  1.4.2010,  05:01 Найти цитируемый пост)
Коллекции не умеют хранить примитивы. 

Ха, куда они денутся. Запихнем все smile


Цитата(jonajo @  1.4.2010,  00:05 Найти цитируемый пост)
Ошибка cannot find symbol - method set(java.lang.Integer,java.lang.Integer).
Я поняла,что вроде как неправильные параметры.

Параметры может и правильные, а метода такого нет в твоем классе.  Правильно MaxPayneC - вызывать нужно метод сет Листа.


--------------------
Lost....
PM MAIL MSN   Вверх
jonajo
Дата 1.4.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне вот уже подсказали.Вот в этом случае все работает и сортирует без проблем.
Только вот почему у меня не работало и в set выкидывало ошибку ?  
Код

public void bubblesort (ArrayList<Integer>  c,int n )
{
for (int i=0;i<n-1;i++){
  for(int j =0;j<n-1;j++)
  if (c.get(j)>c.get(j+1)){
       c.set(j+1, c.get(j+1)+c.get(j));
       c.set(j, c.get(j+1)-c.get(j));
 c.set(j+1, c.get(j+1)-c.get(j));
}}
 
}[quote]

[/quote]

PM MAIL   Вверх
batigoal
Дата 1.4.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(MaxPayneC @  1.4.2010,  09:48 Найти цитируемый пост)
Коллекции не умеют хранить не-наследников Object. Я полагаю, вы имели в виду autoboxing.

Разумеется.

Цитата(jonajo @  1.4.2010,  13:17 Найти цитируемый пост)
Только вот почему у меня не работало и в set выкидывало ошибку ?  

потому что у тебя было не с.set(x, x) а set(x, x).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
aleksandy
Дата 2.4.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



autoboxing - зло.
Во-первых 

Цитата(batigoal)

Давным-давно уже умеют.

А вот и нет...

Цитата(http://www.cyberguru.ru/programming/java/java5-features.html)

Доводы за и против:

    * Оборачивание и распаковка происходит за занавесом. Посмотрите на сгенерированный код:

Код

               92:  iconst_4
                93:  invokestatic    #31; 
             //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
                96:  invokestatic    #33; 
             //Method foo4:(Ljava/lang/Integer;)Ljava/lang/Integer;
                99:  invokevirtual   #23; 
             //Method java/lang/Integer.intValue:()I
                102: istore_1


      Этот код кажется обманывающим - у него есть проблемы с производительностью, особенно если вы вызываете методы со значительными вычислительными нуждами.
    * Если объект Integer равен null, его назначение int в результате вызовет выброс исключения – NullPointerException.
    * Поймите, что означает == . Для объектов вы сравниваете идентичность, а для примитивных типов вы сравниваете значение. В случае с auto-unboxing происходит сравнение, основанное на значениях.
    * Используйте его только когда производительность не важна.

PM   Вверх
batigoal
Дата 3.4.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



aleksandy, Вы на практике сталкивались с программными ошибками, связанными с использованием автобоксинга в коллекциях? Я - нет.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
aleksandy
Дата 5.4.2010, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, не сталкивался. Но при чем здесь ошибки? 
Во-первых, я имел ввиду, что при 
Код

int i = 1234;
List<Integer> list = new ArrayList<Integer>();
list.add(i);

в коллекции все равно будет храниться не примитивный int, а его обертка Integer.

Во-вторых, тормоза достаточно весомые.
Код

public static void main(String[] args) {
    long time = System.nanoTime();
    Integer i1 = 4321;
    Integer i2 = 3087;
    System.out.println(System.nanoTime() - time);
    time = System.nanoTime();
    int i6 = 4321;
    int i7 = 3087;
    System.out.println(System.nanoTime() - time);
    time = System.nanoTime();
    i6 = i1.intValue();
    i7 = i2.intValue();
    time = System.nanoTime() - time;
    System.out.println("время: " + time);
}

Вывод
Код

время: 1719492
время: 2235
время: 8381


Это сообщение отредактировал(а) aleksandy - 5.4.2010, 05:23
PM   Вверх
batigoal
Дата 5.4.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(aleksandy @  5.4.2010,  06:12 Найти цитируемый пост)
Во-первых, я имел ввиду, что при  ......   в коллекции все равно будет храниться не примитивный int, а его обертка Integer.

Да, но почему это - зло?

Цитата(aleksandy @  5.4.2010,  06:12 Найти цитируемый пост)
Во-вторых, тормоза достаточно весомые.

Тут соглашусь, хотя, опять же, экономить перформанс на заменах коллекций массивами - сомнительная практика в большинстве случаев.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
jk1
Дата 5.4.2010, 08:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Во-вторых, тормоза достаточно весомые.

На мой взгляд не все так однозначно. Во-первых, в отличие от ваших 3х порядков на моей машине дает разницу на порядок, а во-вторых вот такой код
Код

 public static void main(String[] args) {
        for (int i=0;i<10000;i++) {
            long time = System.nanoTime();
            int i6 = 4321;
            int i7 = 3087;
            System.out.println(System.nanoTime() - time);
            time = System.nanoTime();
            Integer i1 = 4321;
            Integer i2 = 3087;
            System.out.println(System.nanoTime() - time);
            time = System.nanoTime();
            i6 = i1.intValue();
            i7 = i2.intValue();
            time = System.nanoTime() - time;
            System.out.println("время: " + time);
        }
    }

в последней итерации дает
Цитата

1000
1080
1080


Вы безусловно правы в том отношении, что аллокация в стеке (как происходит с примитивами) дешевле аллокации объектов в куче, но оптимизационная выгода получается довольно сомнительной. Не перекроет ли этот выигрыш постоянная необходимость в boxing/unboxing? Ответ зависит от конкретной задачи.

Микробенчмарки, такие как ваш тест, редко действительно меряют что-то осмысленное, вот неплохая статья на этот счет http://www.ibm.com/developerworks/ru/libra...2214/index.html


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
aleksandy
Дата 6.4.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(batigoal)

Да, но почему это - зло?

Потому что если в коллекции хранится объект, то и надо работать с  объектом. Так, имхо, правильно.

Цитата(batigoal)
экономить перформанс на заменах коллекций массивами

А я этого и не предлагал...

jk1,
Вот такой тест устраивает smile.
Код

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    System.out.println("= 1.1 =");
    long time = System.nanoTime();
    for (int i = 0; i < 10000000; i++) {
        list.add(i);
    }
    time = System.nanoTime() - time;
    System.out.println(time);
                                                             
    System.out.println("= 1.2 =");
    time = System.nanoTime();
    System.out.println(list.contains(5678));
    time = System.nanoTime() - time;
    System.out.println(time);
    list.clear();

    System.out.println("= 2.1 =");
    time = System.nanoTime();
    for (int i = 0; i < 10000000; i++) {
        list.add(Integer.valueOf(i));
    }
    time = System.nanoTime() - time;
    System.out.println(time);

    System.out.println("= 2.2 =");
    time = System.nanoTime();
    System.out.println(list.contains(Integer.valueOf(5678)));
    time = System.nanoTime() - time;
    System.out.println(time);

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

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

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


 




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


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

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