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


Автор: jonajo 1.4.2010, 00:05
Задали задачу ,переделать алгоритм сортирования массива в сортирование в 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).
Я поняла,что вроде как неправильные параметры.
Помогите правильно написать,пожалуйста 

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

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

Цитата

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


Да вроде бы для нее...

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

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

Коллекции не умеют хранить примитивы.

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

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

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

Автор: MaxPayneC 1.4.2010, 08:48
Цитата(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(...)), а во-вторых, первым аргументом передавать индекс заменяемого значения.

Автор: Kangaroo 1.4.2010, 10:47
Цитата(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 - вызывать нужно метод сет Листа.

Автор: jonajo 1.4.2010, 12:17
Мне вот уже подсказали.Вот в этом случае все работает и сортирует без проблем.
Только вот почему у меня не работало и в 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]

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

Разумеется.

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

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

Автор: aleksandy 2.4.2010, 12:21
autoboxing - зло.
http://www.skipy.ru/technics/objCompPr.html#unboxing 

Цитата(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 происходит сравнение, основанное на значениях.
    * Используйте его только когда производительность не важна.

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

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

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

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

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

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

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

Автор: jk1 5.4.2010, 08:45
Цитата

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

На мой взгляд не все так однозначно. Во-первых, в отличие от ваших 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/library/j-jtp12214/index.html

Автор: aleksandy 6.4.2010, 07:55
Цитата(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);

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