Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9

Вызов методов с параметрами и возвращение результатов выполнения

02.10.2013, 07:27. Показов 4711. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Сейчас делаю тестовое задание на Junior Java Programmer и в целом мне понятно как реализовать его. Но я хочу что бы код был красиво написан, а не быдло код. У меня вопрос: как реализовать метод, что бы он мог вернуть 6 ArrayList'ов? И как передать эти ArrayList'ы другому методу при том что этот метод, опционален, то есть человек может кликнуть по кнопке Экспорт в базу данных, а может и не кликнуть. Где можно сохранить полученные значения от класса sendMoneyPoints, так что бы потом при необходимости записать в базу данных?

Задание заключается в написании программы парсера данных с сайта, сразу скажу сервиса для отдачи данных в XML там нету. GUI программа с возможностью поиска по городам и с возможностью сохранения результатов в sqlite db и csv файле.

Почему 6 ArrayList'ов? Программа с сайта получает ~1200 значений которые относятся к 6 категориям. Конечно можно передавать одним массивом и на месте парсить, но это совсем тупо. Так как придется парсить и для вставки в JTable и записи в файл/базу данных. То есть в 3х экшлистенерах. Вообще всю логику можно реализовать в MainGUI классе, но это не вариант.

Метод парсинга
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void sendMoneyPoints() throws IOException {
        Document doc = Jsoup.connect(URL_SEND_MONEY).get();
        Elements links = doc.select("td");
        int i=0;
        
        //Этот участок кода не знаю чем заменить, так как без инициализации не работает while
 
        Iterator<Element> agent=links.listIterator(i);
        Iterator<Element> address=links.listIterator(i);
        Iterator<Element> phone=links.listIterator(i);
        Iterator<Element> currency=links.listIterator(i);
        Iterator<Element> commission=links.listIterator(i);
        Iterator<Element> info=links.listIterator(i);
 
    
        while(agent.hasNext() && address.hasNext() && phone.hasNext() && currency.hasNext() && commission.hasNext() && info.hasNext()){
 
            agent=links.listIterator(i++);
            address=links.listIterator(i++);
            phone=links.listIterator(i++);
            currency=links.listIterator(i++);
            commission=links.listIterator(i++);
            info=links.listIterator(i++);
 
            agents.add(agent.next().text());
            addresses.add(address.next().text());
            phones.add(phone.next().text());
            currencies.add(currency.next().text());
            commissions.add(commission.next().text());
            infos.add(info.next().text());
        }
 
    }


Метод записи в DataBase
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public void InsertInto(List<String> agents, List<String> addresses, List<String> phones, List<String> currencies, List<String> commissions, List<String> infos, String countryId, String city) throws ClassNotFoundException, SQLException {
 
        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:"+countryId+"."+city+".db");
        c.setAutoCommit(false);
        System.out.println("Opened database successfully");
        stmt = c.createStatement();
        for(int i=0; i<agents.size(); i++){
            String query = "insert into 'POINTS' ('id','agent','address','phone','currency','commission','info') " +
                    "values ('"+i+"','"+agents.get(i)+"','"+addresses.get(i)+"','"+phones.get(i)+"','"+currencies.get(i)+"','"+commissions.get(i)+"','"+infos.get(i)+"'); ";
            stmt.executeUpdate(query);
        }
        stmt.close();
        c.commit();
        c.close();
    }


Итого у меня 5 методов, я реализовал и через отдельные классы и через методы в одном классе. Но что бы получить данные из методов мне приходится писать костыли реальные и получается некий быдло-код. Буду благодарен за любые исправления и идеи. Так, как хорошего стиля программирования я не видел, а надо за три дня сделать конфетку.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2013, 07:27
Ответы с готовыми решениями:

возвращение 2 результатов
function include_content($theme) { $file_con = '/content/'.$theme.'/контент.txt'; $title = title($theme); if...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Возвращение результатов функции в несколько переменных
Здраствуйте, можно ли как-то припомощи оператора return вернуть несколько значений? Если да, то как после вызова функции вернуть первой...

22
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 10:06
Создайте класс, где будут жить ваши списки и уже им и бросайтесь по программе как вам нужно
0
02.10.2013, 10:20

Не по теме:

не совсем по теме, но как-то очень самоуверенно так заявлять без проверки

Java
1
System.out.println("Opened database successfully");

0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
02.10.2013, 11:49
Попробуйте почитать о патерне фабрика. Он я думаю весьма отлично поможет вам справится с задачей, та и на роботодателя произведёт благоприятное впечатление что вы знакомы с патернами.

Добавлено через 1 минуту
+ DAO
+ женерики
0
352 / 162 / 20
Регистрация: 22.12.2011
Сообщений: 352
02.10.2013, 11:49
Цитата Сообщение от justz Посмотреть сообщение
как реализовать метод, что бы он мог вернуть 6 ArrayList'ов
Цитата Сообщение от justz Посмотреть сообщение
Но я хочу что бы код был красиво написан, а не быдло код
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
02.10.2013, 11:50
И забыл о многопоточности 6 разных типов данных... Почему бы в 6-ти потоках не обрабатывать?
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
02.10.2013, 14:52  [ТС]
warloc69, спасибо. Про фабрику почитаю. Но вот насчет потоков я не знаю как распарсить 1200 позиций в потоках, что бы сохранился определенный порядок. Как вы наверное поняли там есть 6 категорий а именно: агент. телефон, адрес, валюта,процентная ставка, дополнительная информация. Я получаю эти данные через jsoup и дело в том что у столбцов нет уникальных id или class'ов. Вот и получается что я имею массив из 1200 элементов, который благодаря чисто логике разбиваю на 6 массивов.

verylazy, это не окончательный код, появляется сообщение чисто что бы я видел.

tankomaz, простите, а не подскажете как это реализовать? Хотя бы ключевые слова или ссылку на материал?
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 16:21
Цитата Сообщение от justz Посмотреть сообщение
tankomaz, простите, а не подскажете как это реализовать? Хотя бы ключевые слова или ссылку на материал?
вот так, чтобы не носиться с шестью списками - пусть будут всегда в одном месте
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.ArrayList;
import java.util.List;
 
class Container {
    // pattern Singleton start...
    private static Container containerInstance = null;
 
    private Container() {
    }
    
    public static Container getInstance() {
        if (containerInstance == null) {
            return containerInstance = new Container();
        }
        return containerInstance;
    }
    // ... pattern Singleton end.
 
    private List<String> list1 = new ArrayList<>();
    private List<String> list2 = new ArrayList<>();
    private List<String> list3 = new ArrayList<>();
    private List<String> list4 = new ArrayList<>();
    private List<String> list5 = new ArrayList<>();
    private List<String> list6 = new ArrayList<>();
 
    public List<String> getList1() {
        return list1;
    }
 
    public void addToList1(String str) {
        list1.add(str);
    }
 
    public List<String> getList2() {
        return list2;
    }
 
    public void addToList2(String str) {
        list2.add(str);
    }
 
    public List<String> getList3() {
        return list3;
    }
 
    public void addToList3(String str) {
        list3.add(str);
    }
 
    public List<String> getList4() {
        return list4;
    }
 
    public void addToList4(String str) {
        list4.add(str);
    }
 
    public List<String> getList5() {
        return list5;
    }
 
    public void addToList5(String str) {
        list5.add(str);
    }
 
    public List<String> getList6() {
        return list6;
    }
 
    public void addToList6(String str) {
        list6.add(str);
    }
 
}
 
public class Main {
    public static void main(String[] args) {
        // Container = new Container(); <- не работает по причине что может быть создан только 1 объект!
        Container c = Container.getInstance();
        c.addToList1("list1_string_1");
        
        Container zzz = Container.getInstance();
        System.out.println(zzz.getList1());
    }
 
}
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 16:36
Цитата Сообщение от warloc69 Посмотреть сообщение
И забыл о многопоточности 6 разных типов данных... Почему бы в 6-ти потоках не обрабатывать?
Цитата Сообщение от justz Посмотреть сообщение
Но вот насчет потоков я не знаю как распарсить 1200 позиций в потоках, что бы сохранился определенный порядок.
правда сейчас опозорюсь дальше некуда за свое умение рисовать, но была-не-была.

Вообщем господин warloc69 имел ввиду нечто параллельное, что "зашло в документ - одновременно каждый ухватил свое - все дождались последнего и пошли дальше" (наглядный срано-пример на картинке ниже), тогда порядок не потеряете, но будут задействованы 6 разных потоков. Поправьте если не правильно понял ход мыслей докладчика и ТС
Миниатюры
Вызов методов с параметрами и возвращение результатов выполнения  
1
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
02.10.2013, 17:07
tankomaz Идеально

Добавлено через 27 минут
Цитата Сообщение от tankomaz Посмотреть сообщение
// ... pattern Singleton end.
не мешало бы кстати добавить синхронизацию
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
02.10.2013, 17:54  [ТС]
tankomaz, warloc69, к сожалению я далек от паттернов, недавно только купил книгу по ним. Но так и не нашел времени почитать. Не очень понимаю что делает singleton в данном примере? Вы предлагаете записать все ArrayList'ы в один Container? Если так то зачем вообще ArrayList'ы если все данные и так в одном массиве.
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 17:56
justz, у вас 1 контейнер, где будут храниться все ваши данные, вам не придется перебрасывать ссылки List'ов с метода в метод, достаточно будет просто вызвать из нужного места программы объект - произвести в нем изменения (считать, добавить..) и работать дальше. Два контейнера вы не создадите, можете быть уверенны в том, что с любого места программы получите одни и те же данные
0
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
02.10.2013, 18:00  [ТС]
tankomaz, а тогда как мне обращаться к элементам Container'а? Мне же их надо получать в цикле, что бы вывести в базу и в JTable, как можно решить задучу что бы не делать цикл в каждом месте вызова Container'a?
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 18:14
Цитата Сообщение от justz Посмотреть сообщение
tankomaz, а тогда как мне обращаться к элементам Container'а? Мне же их надо получать в цикле, что бы вывести в базу и в JTable, как можно решить задучу что бы не делать цикл в каждом месте вызова Container'a?
например вот так
....
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static void main(String[] args) {
        // Container = new Container(); <- не работает по причине что может быть создан только 1 объект!
        Container c = Container.getInstance();
        c.addToList1("list1_string_1");
        c.addToList1("list1_string_2");
        c.addToList1("list1_string_3");
        c.addToList1("list1_string_4");
        c.addToList1("list1_string_5");
        
        for (String str : c.getList1()) {
            System.out.println(str);
        }
        // или
        
        List list = c.getList1();
        System.out.println(list);
    }
... через for
1
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
02.10.2013, 18:23  [ТС]
tankomaz, то есть получается что в каждом actionPerformed я должен создавать цикл? Я боюсь будет не более изящным решением чем, то что у меня уже есть. Я в MainGUI создаю такие же ArrayList'ы и когда выполняю метод sendMoneyPoints(), получаю значения через имя_класса.class.имя_ArrayList'а. Получается конструкция вида

Java
1
this.agents = sendMoneyPoints().class.agents
Хотя я щас пишу и понимаю, что без цикла в actionPerformed в обоих случаях не обойтись. Хм, а нет ли более изящного решения для хранения и передачи данных между классами? Что бы в одном месте цикл только был?
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.10.2013, 18:34
Цитата Сообщение от justz Посмотреть сообщение
.... Что бы в одном месте цикл только был?
слабо вас понимаю, покажите какие места вам не понятны на примере
1
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
02.10.2013, 18:38  [ТС]
tankomaz, я понимаю о чем вы говорите. Но по сути все придется решать через цикл в каждом месте где нужно вывести данные, так ведь? То есть цикл один раз написать и в остальных местах забыть о нем не получится? Спасибо
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
02.10.2013, 18:41
justz Вы видите весь код, мы видим только не большие кусочки программы исходя из которых мы предлагаем вам возможные варианты. Но переписать за Вас весь код программы вряд ли кто то сможет, темболие не видя всей картины. Хотите кокретней - конкретней код в студию ) например обработчики екшенов )
1
0 / 0 / 0
Регистрация: 07.07.2013
Сообщений: 9
03.10.2013, 02:02  [ТС]
warloc69, tankomaz, спасибо вам. А не могли бы еще подсказать, как сделать что бы getter возвращал ArrayList не как строку, а как массив?
Просто когда я вызывают get'тер в другом классе то мне выдает весь массив, индексы не помогают.

SomeClass.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
private List<String> someArray = new ArrayList<String>();
 
    public List<String> getSomeArray() {
        return someArray;
    }
 
    public void setSomeArray(List<String> someArray) {
        this.someArray = someArray;
    }


Main.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
GetMoneyPoints get = new GetMoneyPoints();
        get.parse();
        String a = get.getAgents().get(1);
        System.out.println(a);


Мне выводит сразу 97 элементов массива, хотя должен вывести второй.
Если без геттеров и сеттеров с модификатором public, все работает, но так не делается
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
03.10.2013, 02:11
Я не вижу абсолютно никакой связи между двумя кусками кода,даже методы разные используете. Вы точно уверены с тек, куда к какому списку обращаетесь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2013, 02:11
Помогаю со студенческими работами здесь

Возвращение результатов на запрос MySQL в переменную
Кто нибудь знает, как из получившегося результата по запросу... ('Select equipment from equipment WHERE adress like...

Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов
Всем привет) помогите пожалуйста с заданием &quot;Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только...

Вызов скрипта с параметрами скрипта рекурсивно с своими глобальными переменными каждый вызов
Всем привет, есть скрипт у которого глобальные переменные на весь файл. Хочу запустить этот скрипт с путем к файлу с параметрами для...

Работа с параметрами методов
Скажите пожалуйста, почему программа ничего не выдаёт? Пустой экран в консоли. Программа по оличению простых чисел от непростых using...

Возвращение цикла do после выполнения while - dev C++
Здравствуйте! Нужен код, чтобы возвращал цикл do после выполнения while Помогите пожалуйста! Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru