небольшие задачи на Java

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

небольшие задачи на Java

Непрочитанное сообщение Olej » 08 дек 2014, 00:44

в консоли набираю сл.:
curl "http://maps.googleapis.com/maps/api/geo ... ess=London"
получаю ответ от гугл АПИ
как мне написать простейшую программу java которая бы имитировала запуск команды curl "[url_string]"
Вот 1-й вариант решения такой задачи:

Код: Выделить всё

import java.io.*;
import java.lang.ProcessBuilder;

public class Child {

   public static void main( String[] args ) {
      String cmd = "curl", parm = "http://maps.googleapis.com/maps/api/geocode/json?address=London";
//      String cmd = "ls", parm = "-l";
      try {
//       1-й вариант:
         ProcessBuilder pb = new ProcessBuilder( cmd, parm );
         // перенаправляем стандартный поток ошибок на стандартный вывод
         pb.redirectErrorStream( true );
         Process p = pb.start();

//        2-й вариант:
//        Process p = new ProcessBuilder( cmd, parm ).start(); 

//        3-й вариант:
//         Process p = Runtime.getRuntime().exec( cmd + " " + parm );

         System.out.println( "запущен процесс: " + cmd + " " + parm + " ..." );
         InputStream in = p.getInputStream();
         OutputStream out = p.getOutputStream();
         System.out.println( in.available() );
         int ret = p.waitFor();
         System.out.println( "код завершения: " + ret );
         // читаем стандартный поток вывода и выводим на экран
         InputStreamReader isr = new InputStreamReader( in );
         BufferedReader brStdout = new BufferedReader( isr );
         String line = null;
         while( ( line = brStdout.readLine() ) != null ) {
            System.out.println(line);
         }
      }
      catch( IOException | InterruptedException ex ) {
         System.out.println( "Error: " + ex.toString() );
      }
   }
   
}  
Вот пробное выполнение с ls:

Код: Выделить всё

[Olej@modules process]$ javac Child.java 
[Olej@modules process]$ java Child 
запущен процесс: ls -l ...
0
код завершения: 0
итого 56
-rwxrwxr-x. 1 Olej Olej 8604 дек  7 22:41 child
-rw-r--r--. 1 Olej Olej 4502 дек  7 21:41 Child1.java
-rw-r--r--. 1 Olej Olej 4628 дек  7 22:36 Child2.java
-rw-rw-r--. 1 Olej Olej  306 дек  7 22:41 child.c
-rw-rw-r--. 1 Olej Olej 1694 дек  7 23:23 Child.class
-rw-r--r--. 1 Olej Olej 5953 дек  7 23:23 Child.java
-rw-r--r--. 1 Olej Olej 5953 дек  7 23:22 Child.java.2
-rw-r--r--. 1 Olej Olej  192 дек  7 20:56 Makefile
А вот в чистом виде вопрос ... с curl:

Код: Выделить всё

[Olej@modules process]$ javac Child.java 
[Olej@modules process]$ java Child 
запущен процесс: curl http://maps.googleapis.com/maps/api/geocode/json?address=London ...
0
код завершения: 0
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "London",
               "short_name" : "London",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "United Kingdom",
               "short_name" : "GB",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "London, UK",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 51.6723432,
                  "lng" : 0.148271
               },
               "southwest" : {
                  "lat" : 51.38494009999999,
                  "lng" : -0.3514683
               }
            },
            "location" : {
               "lat" : 51.5073509,
               "lng" : -0.1277583
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 51.6723432,
                  "lng" : 0.148271
               },
               "southwest" : {
                  "lat" : 51.38494009999999,
                  "lng" : -0.3514683
               }
            }
         },
         "types" : [ "locality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "London",
               "short_name" : "London",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Middlesex County",
               "short_name" : "Middlesex County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Ontario",
               "short_name" : "ON",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Canada",
               "short_name" : "CA",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "London, ON, Canada",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 43.073245,
                  "lng" : -81.1063879
               },
               "southwest" : {
                  "lat" : 42.824517,
                  "lng" : -81.390852
               }
            },
            "location" : {
               "lat" : 42.9869502,
               "lng" : -81.243177
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 43.073245,
                  "lng" : -81.1063879
               },
               "southwest" : {
                  "lat" : 42.824517,
                  "lng" : -81.390852
               }
            }
         },
         "types" : [ "locality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "London",
               "short_name" : "London",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Laurel County",
               "short_name" : "Laurel County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Kentucky",
               "short_name" : "KY",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "London, KY, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 37.1522599,
                  "lng" : -84.03595709999999
               },
               "southwest" : {
                  "lat" : 37.0797589,
                  "lng" : -84.126262
               }
            },
            "location" : {
               "lat" : 37.1289771,
               "lng" : -84.08326459999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.1522599,
                  "lng" : -84.03595709999999
               },
               "southwest" : {
                  "lat" : 37.0797589,
                  "lng" : -84.126262
               }
            }
         },
         "types" : [ "locality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "London",
               "short_name" : "London",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Madison County",
               "short_name" : "Madison County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Ohio",
               "short_name" : "OH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "43140",
               "short_name" : "43140",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "London, OH 43140, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 39.921786,
                  "lng" : -83.3899969
               },
               "southwest" : {
                  "lat" : 39.85928,
                  "lng" : -83.47892299999999
               }
            },
            "location" : {
               "lat" : 39.8864493,
               "lng" : -83.4482529
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 39.921786,
                  "lng" : -83.3899969
               },
               "southwest" : {
                  "lat" : 39.85928,
                  "lng" : -83.47892299999999
               }
            }
         },
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}
Вложения
Child.java
(1.57 КБ) 308 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 23 дек 2014, 17:40

Свежий справочник пакетов Java Java™ Platform Standard Ed. 8, который необходим при написании даже самых небольших ;-) задач на Java.

yko
Интересующийся
Сообщения: 7
Зарегистрирован: 06 дек 2014, 23:40
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение yko » 04 янв 2015, 21:17

спасибо за развернутый ответ в прошлый раз.

у меня есть еще вопрос.

есть файл, с которого я хочу считать информацию (bbb):
то есть всегда String, Double, Double , и дальше много ненужной мне информации
поля всегда разделены делиметром ","

моя программа должна находить файл для обработки (передаю его скрипту позиционным параметром) в котором будет паттерн, строки которого я хочу найти в файле выше
прикрепил пример такого файла (tmp)

программа должна создать коллекцию для нужных! строк, содержащую 1,2,3 поля с которой я буду дальше работать

я на примере этого скрипта не гонюсь за быстротой работы или следованию принципам ООП -
- так что просьба не пинать за "кривое" программирование : -)

прикрепленный код НЕ компилируется

Код: Выделить всё

javac postalCodeParser.java 
postalCodeParser.java:68: error: cannot find symbol
		pcs_map.put(full_code, Coords(x0,y0));
		                       ^
  symbol:   method Coords(double,double)
  location: class postalCodeParser
postalCodeParser.java:68: error: cannot find symbol
		pcs_map.put(full_code, Coords(x0,y0));
		^
  symbol:   variable pcs_map
  location: class postalCodeParser
2 errors
Вложения
postalCodeParser.java
(3.04 КБ) 269 скачиваний
bbb.csv
(598 байт) 277 скачиваний
tmp.csv
(5 байт) 270 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 04 янв 2015, 23:19

yko писал(а): у меня есть еще вопрос.

есть файл, с которого я хочу считать информацию (bbb):
то есть всегда String, Double, Double , и дальше много ненужной мне информации
поля всегда разделены делиметром ","

моя программа должна находить файл для обработки (передаю его скрипту позиционным параметром) в котором будет паттерн, строки которого я хочу найти в файле выше
прикрепил пример такого файла (tmp)

программа должна создать коллекцию для нужных! строк, содержащую 1,2,3 поля с которой я буду дальше работать
1. Меня всегда смущали вопросы, которые привносят множество непотребных частностей: какие-то файлы, патерны и пр., пр., пр. ...
Высоким искусством программиста разработчика является умение (вырабатывается годами) вычленить из "желаю" минимально-необходимое ядро "необходимо" + умение сформулировать конкретных кратких автономных тестов, дающих ответ на поставленный вопрос (не в заготовку будущей программы "втулить" 1001 printf(), а написать сформулировать минимальный тест на поставленную задачу).

2. У вас задача то состоит:
- выбрать адекватную структуру данных, что-то типа:

Код: Выделить всё

class Coords {
   double x, y;
   String key;
}
- собрать такие элементы в некоторую коллекцию (массив, хэш-таблицу, ...) ...
- ключом поиска в этой коллекции должна быть строка key (строка в конкретной реализации коллекции может и не входить в структуру элемента, а быть именно ключом поиска);
- выбирать (искать) элементы, выстроенные в эту коллекцию.
yko писал(а): я на примере этого скрипта не гонюсь за быстротой работы или следованию принципам ООП -
- так что просьба не пинать за "кривое" программирование : -)
А это в принципе неправильная постановка вопроса.
И дело вовсе не в кривом или прямом программировании ... или уж, тем более, в скорости (кого волнует скорость?), а в том, что выбор и решения должны быть продуманными, и это по-быстренькому не делается...

Наилучший вариант: рассмотреть несколько альтернативных решений!
yko писал(а): прикрепленный код НЕ компилируется
... а теперь можно и посмотреть, почему он не компилируется :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 04 янв 2015, 23:30

yko писал(а): прикрепленный код НЕ компилируется

Код: Выделить всё

javac postalCodeParser.java 
postalCodeParser.java:68: error: cannot find symbol
		pcs_map.put(full_code, Coords(x0,y0));
		                       ^
  symbol:   method Coords(double,double)
  location: class postalCodeParser
postalCodeParser.java:68: error: cannot find symbol
		pcs_map.put(full_code, Coords(x0,y0));
		^
  symbol:   variable pcs_map
  location: class postalCodeParser
2 errors
А он и не может компилироваться ;-) ... потому, что (на первый взгляд!):

- ваша переменная с именем pcs_map объявлена локально внутри метода (функции) main, и не может быть видима за её пределами (в других методах):

Код: Выделить всё

HashMap <String,Coords> pcs_map = new HashMap <String,Coords>();
- конструктор не является публичным, он недоступен за пределами класса Coords:

Код: Выделить всё

        Coords (double x0, double y0) {

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 04 янв 2015, 23:47

Olej писал(а): - ваша переменная с именем pcs_map объявлена локально внутри метода (функции) main, и не может быть видима за её пределами (в других методах):

Код: Выделить всё

HashMap <String,Coords> pcs_map = new HashMap <String,Coords>();
- конструктор не является публичным, он недоступен за пределами класса Coords:

Код: Выделить всё

        Coords (double x0, double y0) {
1. Вынесите ваше описание pcs_map на уровень класса (как статический член, что не всегда хорошо) - и оно будет доступно (видимо) всем методам класса.

2. Кто вас гонит в шею? ... чтобы написать "всю задачу целиком", а потом начинать её компилировать (с предсказуемым результатом).
По ходу, пока вы пишете - проверяйте свои служебные классы ... хотя бы как в вашем примере, где я всё, что меня не интересовало, закрыл комментариями:

Код: Выделить всё

[Olej@modules map]$ javac postalCodeParser.java 
[Olej@modules map]$ java postalCodeParser xxx
<1.0;2.0>
<2.0;3.0>
Вложения
postalCodeParser.java
(3.28 КБ) 289 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 05 янв 2015, 00:00

Olej писал(а): По ходу, пока вы пишете - проверяйте свои служебные классы ...
Для случаев 2D-координат (2 х double), а это очень частый случай, очень неплохой вариант - взять комплексное число для представления координаты (собственно, комплексное значение и есть представление точки в 2-мерном пространстве).
Класс Complex много реализаций представлено в сети ... можно взять здесь (один файл реализации .java из большого математического пакета).
// From David Eck and Richard Palais. http://3D-XplorMath.org/j/index.html.
Тогда ваш Coords класс становится просто производным от Complex (что можно и не объявлять-переименовывать отдельно).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 05 янв 2015, 01:19

Я переделал ваш код (хотя там ещё может быть очень много замечаний и улучшений). Теперь он не только компилируется, но даже работает :lol: :

Код: Выделить всё

[Olej@modules map]$ javac postalCodeParserC.java
[Olej@modules map]$ java postalCodeParserC tmp.csv
<1.0;2.0>
<2.0;3.0>
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AA | 0.0 | 0.0 => AB21 0AA : <0.0;0.0>
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AB | 0.0 | 0.0 => AB21 0AB : <0.0;0.0>
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AD | 0.0 | 0.0 => AB21 0AD : <0.0;0.0>
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AE | 0.0 | 0.0 => AB21 0AE : <0.0;0.0>
AB21 0AF,57.196535,-2.208476,387501,811768
AB21 0AF | 0.0 | 0.0 => AB21 0AF : <0.0;0.0>
[ AB21 0AA : <0.0;0.0> , AB21 0AB : <0.0;0.0> , AB21 0AD : <0.0;0.0> , AB21 0AE : <0.0;0.0> , AB21 0AF : <0.0;0.0> ,  ]
Но дело в том, что у вас в функции substr_pcs_with_coordinates(), в разборке полей полученной строки - происходит ерунда, и считываются всегда координаты x=0 & y=0.
(там много отладки оставлено: как вы видите, строка из файла читается правильно, но при разборке, перед конструктором Point, в координатах записана ерунда = 0)

Я динамическую хэш-таблицу типа HashMap<String,Coords> сознательно заменил на более простой случай статического массива:

Код: Выделить всё

private static Point [] pcs_map = new Point[ 1000 ];

Ну рано, поверьте, пока при таком качестве кода ещё отлаживать это с динамическими контейнерными классами :lol: .
Позже, доведя до ума существующий код, это будет легко дополнить.
Вложения
postalCodeParserC.java
(4.59 КБ) 267 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: небольшие задачи на Java

Непрочитанное сообщение Olej » 05 янв 2015, 11:59

Olej писал(а): Но дело в том, что у вас в функции substr_pcs_with_coordinates(), в разборке полей полученной строки - происходит ерунда, и считываются всегда координаты x=0 & y=0.
(там много отладки оставлено: как вы видите, строка из файла читается правильно, но при разборке, перед конструктором Point, в координатах записана ерунда = 0)
Я вам поправил ваш пример. Только сделал это по принципу не лучше-хуже, а ... как в анекдоте про армянское радио:
- Как сделать скрипку?
- Нужно взять контрабас и опилить его рубанком.
Просто тупо повыкидывал оттуда лишнее ... Ничего не улучшая, и не используя другие классы, которые я бы использовал для простоты.

Всё работает, а что там "лишнее" вы посмотрите сами:

Код: Выделить всё

[Olej@modules map]$ javac postalCodeParserC.java 
[Olej@modules map]$ java postalCodeParserC tmp.csv 
[ 'AB21 0AA'<57.260381;-2.156371> 'AB21 0AB'<57.263426;-2.162932> 'AB21 0AD'<57.259724;-2.157131> 'AB21 0AE'<57.25942;-2.155969> 'AB21 0AF'<57.196535;-2.208476> ]
AB21 0AE => 'AB21 0AE'<57.25942;-2.155969>

Код: Выделить всё

[Olej@modules map]$ java postalCodeParser tmp.csv 
[ 'AB21 0AA'<57.260381;-2.156371> 'AB21 0AB'<57.263426;-2.162932> 'AB21 0AD'<57.259724;-2.157131> 'AB21 0AE'<57.25942;-2.155969> 'AB21 0AF'<57.196535;-2.208476> ]
AB21 0AB => 'AB21 0AB'<57.263426;-2.162932>
Вариант postalCodeParserC.java - это вариант с классом Complex и наследованием координат от комплексных значений.
Вариант postalCodeParser.java - это вариант с простым "ручным" определением структуры координат.
Сразу ответ на вопрос: почему представление с наследованием от Complex лучше? ... если оно нисколько не проще...

Потому (по моему мнению), что до тех пор, пока с координатами вам ничего не нужно делать - ручное представление "проще", но как только вам нужны будут какие-то осмысленные действия над координатами, самое частое из которых - нахождение расстояний (метрика), то комплексные операции предоставляют вам готовые операции, а самодеятельная реализация потребует писать каждую операцию руками. Но ещё хуже - её придётся объяснять каждому читающему ваш код, а для комплексного представления - это естественные и общепризнанные операции.
Вложения
postalCodeParserC.java
(3.71 КБ) 265 скачиваний
Complex.java
(7.02 КБ) 283 скачивания
postalCodeParser.java
(3.71 КБ) 287 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей