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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с массивами произвольного типа 
:(
    Опции темы
yaja
Дата 19.3.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Возникла проблема. Необходимо передавать некоторый массив классу, а класс будет просто обрабатывать его данные. Точнее даже не обрабатывать данные, а преобразовывать их в строки и их просто выводить на экран. Проблема в том, что тип массива должен быть любым, т.е. и int и double и Object (последний не обязателен, но желателен)...
Существует ли какой-то способ одинаково с ними работать??
Преобразовывать данные в строки во внешнем, по отношению к классу, коде не подходит...
PM MAIL   Вверх
zer
Дата 20.3.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Использовать Object[] у него же есть метод toString()
PM MAIL   Вверх
LSD
Дата 20.3.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Передавать ссылку как Object (не Object[] а именно Object) а в коде проверять тип массива и обрабатывать его соответсвенно.
Или использовать классы оболочки Integer, Double и т.д.
Добавлено @ 10:37
Цитата(zer @ 20.3.2006, 10:22 Найти цитируемый пост)
Использовать Object[] у него же есть метод toString()

int[] нельзя передать как Object[], и метод toString() вернет что-то вроде [I@a4d5623.


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


Шустрый
*


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

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



LSD, использовать классы оболочки будет слишком накладно...
А передать как Object наверное подойдет. Только как проверять тип передаваемого массива? Делать обычное преобразование типа и проверять вылетает ли исключение? Или есть другой метод?
PM MAIL   Вверх
powerOn
Дата 21.3.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Есть такая конструкция волшебная instanceof
с её помощью можно выполнить проверку типа

вот примерчик
Код

       Object o = null;
        int i = 1;
        o = i;
        if (o instanceof Integer) {
            System.out.println("Integer!");
        }



--------------------
user posted image нет времени думать - нужно писать КОД!

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


Шустрый
*


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

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



MoonCat, незнал, что он и с массивами работает smile
Но я все-равно получаю немного не то, что ожидал. Тогда получается некоторый следующий код в классе
Код

class Tmp {
        private int[] intData;
        private double[] doubleData;
        private Object[] objData;
        
        public Tmp(Object o) {
            if (o instanceof int[]) intData = (int[])o;
            else if (o instanceof double[]) doubleData = (double[])o;
            else if (o instanceof Object[]) objData = (Object[])o;
        }
        
        public void paint() {
            if (intData != null) { 
                /* draw int*/ 
            } else if (doubleData != null) {
                /* draw double */
            } else if (objData != null) {
                /* draw Object */
            }
        }
    }


Что безусловно не есть гуд, если вдруг захочется передать массив другого типа... smile
А нельзя ли использовать какой-нибудь стандартный контейнер? Такой, что при изменении самого массива, автоматически обновлялись данные и в контейнере??
PM MAIL   Вверх
powerOn
Дата 21.3.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Ну тогда, видимо, надо сделать так

Код

class Tmp {

        private Object[] objData =null;
        
        public Tmp(Object [] o) {

        objData = new Object[o.length];
        for(int i = 0; i < o.length; i++) {
            objData[i] = o[i];
        }
            
        }
        
        public void paint() {
            // Здесь добавишь проверку типа 
            if (o instanceof int[]) {}
            else if (o instanceof double[]) {}
            else if (o instanceof Object[]) {}

        }
    }



в зависимоти от решаемой задачи можно доработать метод paint.

smile поправил собственные баги........

Это сообщение отредактировал(а) MoonCat - 21.3.2006, 20:22


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 21.3.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Проблема в том, что массив примитивного типа приводится только к Object. Соответсвенно даже для того чтобы тебе сделать итерацию по массиву уже надо знать его тип. Поэтому или 10 if-ов или оболочки. Слишком накладными классы оболочки становятся на размерах массива больше 1 000 000.
А в чем проблема с универсальностью? Примитивных типов немного, и они добавляться не будут, а вот все остальный массивы можно передать как Object[].

Конечно есть универсальный вариант с рефлексией. Но он подходит только для Маленького теста, а не практического применения.


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


Шустрый
*


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

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



MoonCat, работать для массивов типа int не будет smile только для объектов.
При использовании оболочек Integer меня смущает то, что будет существовать два никак не связанных объекта, int[] и Integer[] и при изменении первого, второй эти изменения никак не прочуствует smile Сами массивы очень маленькие, порядка 10-20 элементов.

LSD, а как тут рефлексию приплести? Тоесть то, что мне представляется, никак не избавит от большого числа ifов.
Мона считать, что приложение маленькое... smile

Можно же получить два списка, отвечающих одной "области памяти". Например метод subList в java.util.List.. Неужеле нету никаких аналогов для массивов простых типов??

Если честно, не хочется писать 10 if (хотя их там меньше и не особо трудно это сделать) потому, что это как то не по "объектно-ориентированному" smile
PM MAIL   Вверх
LSD
Дата 21.3.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(yaja @ 21.3.2006, 22:16 Найти цитируемый пост)
Если честно, не хочется писать 10 if (хотя их там меньше и не особо трудно это сделать) потому, что это как то не по "объектно-ориентированному"

А все из-за того что у нас есть не объекты smile
Так что способ, вполне нормальный.

А про рефлексию, я пожалуй напишу в Маленький тест. Пусть народ развлечется, все равно этот способ нельзя считать практичным smile

Цитата(yaja @ 21.3.2006, 22:16 Найти цитируемый пост)
Можно же получить два списка, отвечающих одной "области памяти". Например метод subList в java.util.List.. Неужеле нету никаких аналогов для массивов простых типов??

Так они разное количество памяти на один элемент занимают, как минимум это мешает.


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


software saboteur
****


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

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



Цитата

MoonCat, работать для массивов типа int не будет smile только для объектов.


сорри, код "на каленке" писал smile
просто для развития мысли, не больше....


--------------------
user posted image нет времени думать - нужно писать КОД!

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

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

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


 




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


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

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