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


Автор: Samotnik 4.12.2007, 02:58
У меня есть  взятые данные из базы и записанные в коллекции
Код

Vector p = new Vector(10,20,30);
Vector v = new Vector(2,6,6);

Каким образом можно производить операции над коллекциями? Мне нужно  В Vector c  записать значения вычесленные по формуле (x+y)/2 т.е. на моем примере, мне нужно получить коллекцию со следущими значенниями:
Код

Vector с = new Vector((10+2)/2,(20+6)/2,(30+6)/2);

и как результат
Код

Vector с = new Vector(6, 13,18 );


 smile 

Автор: AlexeyVorotnikov 4.12.2007, 09:54
Во-первых, у класса Vector нет конструктора с тремя аргументами.
Ну а сами вычисления делаются в цикле. Что-то типа:
Код

for (int i=0; i < p.size(); i++) {
    c.set(i, (p.get(i) + v.get(i))/2);
}

Автор: Samotnik 4.12.2007, 10:58
Цитата(AlexeyVorotnikov @  4.12.2007,  08:54 Найти цитируемый пост)
Во-первых, у класса Vector нет конструктора с тремя аргументами.

Эт понятно, я ведь схематично изобразил. У меня векктор заполняется данными взятыми из базы!
За пример спс, нр вся  проблема в том, что он не работает. Пишит:
Цитата

operator + cannot be applied to java.lang.Object, java.lang.Object

Я сам тоже пробывал различными способами делить элементы коллекций, но IDEA выдает одну и ту же ошибку!!   smile 
 

Автор: Kangaroo 4.12.2007, 11:09
Samotnik, 
используй generics. 

Код

Vector p = new Vector();
p.get(i); //возращает Object


Код

Vector<Integer> p = new Vector<Integer>();
p.get(i); //возращает Integer


Автор: AlexeyVorotnikov 4.12.2007, 11:10
Ну я тоже схематично написал smile

У вас коллекция типизированная или нет? Т.е. декларируется ли вектор как
Код

Vector<Integer> p;

или просто
Код

Vector p;


В первом случае надо писать
Код

for (int i=0; i < p.size(); i++) {
    c.set(i, (p.get(i).intValue() + v.get(i).intValue())/2);
}

во втором
Код

for (int i=0; i < p.size(); i++) {
    c.set(i, new Integer((((Integer) p.get(i)).intValue() + ((Integer) v.get(i)).intValue())/2));
}

Автор: Samotnik 4.12.2007, 11:24
Kangaroo,  пасибо,  запустилось, но выдает Exception 
Цитата

Exception : java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
    at java.util.Vector.set(Unknown Source)
    at ServerS$1Listener.run(ServerS.java:284)
    at java.lang.Thread.run(Unknown Source)

Вот мой код:
Код

int op, oopr;
                                Vector<Integer> p = new Vector<Integer>();
                                Vector<Integer> v= new Vector<Integer>();
                                Vector<Integer> resu = new Vector<Integer>();
                                Connection con = DriverManager.getConnection(url, "dba", "sql");
                                String stmt_source = "Select OP from KRD";
                                Statement stmt = con.createStatement();
                                rs = stmt.executeQuery(stmt_source);

                                while (rs.next()) {
                                    op = rs.getInt("OP");
                                    p.addElement(op);
                                }
                                System.out.println("Result1 is" + p);

                                stmt_source = "Select OOPR from KRD";
                                rs = stmt.executeQuery(stmt_source);
                                while (rs.next()) {
                                    oopr = rs.getInt("OOPR");
                                    v.addElement(oopr);
                                }
                                System.out.println("Result2 is" + v);
                                
                                for (int i = 0; i < p.size(); i++) {
                                 resu.set(i, (p.get(i) + v.get(i))/2);
                                }
                                System.out.println("Res  "  + resu);
                                con.close();
                            }

Вроде просто все, но не работает....
Пэ.Эс.
Кстати,а что значит это исключение ?

Добавлено через 3 минуты и 13 секунд
AlexeyVorotnikov,  Пасибо, но все равно тот же ексепшн  smile 
Цитата

Exception : java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
    at java.util.Vector.set(Unknown Source)
    at ServerS$1Listener.run(ServerS.java:282)
    at java.lang.Thread.run(Unknown Source)


Добавлено через 6 минут и 40 секунд
282 строка, это 
Код

resu.set(i, new Integer((((Integer) p.get(i)).intValue() + ((Integer) v.get(i)).intValue())));

Автор: Dims 4.12.2007, 11:48
В переводе это исключение значит "выход индекса за границы". Индекс равен нулю. Это значит, что происходит попытка обращения к нулевому элементу, которого нет. Раз нет нулевого элемента, то рассматриваемый вектор вообще пуст. Поскольку размер вектора p проверяется в цикле, то пуст вектор v.

Выше вижу, что он заполняется в каком-то цикле. Вероятно, этот цикл не выполняется ни разу.

Автор: Samotnik 4.12.2007, 11:48
2 all Спасибо всем!!!  СДЕЛАЛ!!  smile 
Нужно было вместо set()  писать add()
Код

resu.add(i, new Integer((((Integer) p.get(i)).intValue() + ((Integer) v.get(i)).intValue())/2));

И все работает!!
Пэ.Эс.
Вопрос, а почему ???

Автор: LSD 4.12.2007, 11:48
Шикарно, у тебя в тексте присутсвует строка:
Код

resu.set(i, (p.get(i) + v.get(i))/2);

а потом ты пишешь, что ошибка в строке:
Код

resu.set(i, new Integer((((Integer) p.get(i)).intValue() + ((Integer) v.get(i)).intValue())));

 smile 



Cудя по всему у тебя какой-то из векторов p  или v пустой. Лучше переписать цикл так:
Код

for (int i = 0; i < p.size() && i < v.size(); i++)
  resu.add((p.get(i) + v.get(i))/2);

Автор: Samotnik 4.12.2007, 16:06
Цитата(Samotnik @ 4.12.2007,  10:48)
2 all Спасибо всем!!!  СДЕЛАЛ!!  smile 
Нужно было вместо set()  писать add()
Код

resu.add(i, new Integer((((Integer) p.get(i)).intValue() + ((Integer) v.get(i)).intValue())/2));

И все работает!!
Пэ.Эс.
Вопрос, а почему ???

Значит никто не знает ответ на этот вопрос,...   Ну ланна, тогда тему закрываю!!!

Автор: Kangaroo 4.12.2007, 16:33
Цитата(Samotnik @  4.12.2007,  15:06 Найти цитируемый пост)
Значит никто не знает ответ на этот вопрос,...   

Знаем!
Тебе просто надо было почитать JavaDoc'u и посмотреть код этих методов.
Итак, 
set(int index, E element)
Цитата

Replaces the element at the specified position in this Vector with the specified element.

А вот код:
Код

 public synchronized E set(int index, E element) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
                ....
    }

То есть сначала сверяется текущее количество элементов с индексом который ты суешь методу. 
А если у тебя пустой массив, то какой элемент ты собираешься там заменить???

А add(E o)
Код

Appends the specified element to the end of this Vector.

Добавляет к Вектору, что тебе и нужно было сделать.

Одним словом -  smile   smile 

Автор: Samotnik 4.12.2007, 16:34
Kangaroo,  ОКИ  СПС  доступно и понятно,  Вобщем  RTFM  smile   

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