java.выбор_коллекции

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

Модератор: Olej

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

java.выбор_коллекции

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

привет
тема берущая начало из viewtopic.php?f=31&t=3883 более обширна
я решил мувнуть ее в отдельный топик

я поправил код после замечаний соседней темы
основные отличия:
1 - он теперь рабочий :-?
2 - он использует коллекцию HashMap

результат работы с отображением полученной коллекции (вызывется в конце работы скрипта из main() функции):

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

$ java postalCodeParser tmp 
AB21 0AA,57.260381,-2.156371,390666,818867,NJ906188,"","Aberdeenshire","East Garioch Ward", S12000034,S13002500
AB21 0AB,57.263426,-2.162932,390271,819207,NJ902192,"","Aberdeenshire","East Garioch Ward", S12000034,S13002500
AB21 0AD,57.259724,-2.157131,390620,818794,NJ906187,"","Aberdeenshire","East Garioch Ward", S12000034,S13002500
AB21 0AE,57.25942,-2.155969,390690,818760,NJ906187,"","Aberdeenshire","East Garioch Ward", S12000034,S13002500
AB21 0AF,57.196535,-2.208476,387501,811768,NJ875117,"","Aberdeen City","Dyce/Bucksburn/Danestone Ward", S12000033,S13002476
  AB21 0AE   57.25942   -2.155969
  AB21 0AF   57.196535   -2.208476
  AB21 0AA   57.260381   -2.156371
  AB21 0AB   57.263426   -2.162932
  AB21 0AD   57.259724   -2.157131
$ 
дальше я хочу сделать следующее:
создать новую коллекцию, где я буду держать данные в сл.формате:
AB21 (тримается пробел и все что после него) AVG(x) AVG(y)

то есть мне понадобится итератор и выборка данных из коллекции HashMap

подскажите, пожалуйста, коллекцию какого класса лучше использовать?
(применение коллекции как таковое это чисто моё желания "поработать" с ними :-))
Вложения
postalCodeParser.java
(3.5 КБ) 310 скачиваний

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

Re: java.выбор_коллекции

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

yko писал(а): тема берущая начало из viewtopic.php?f=31&t=3883 более обширна
я решил мувнуть ее в отдельный топик
вряд ли это хорошо, потому как "раскрутку" одной задачи удобно делать в одной теме, чтобы не бегать туда-сюда...
yko писал(а): я поправил код после замечаний соседней темы
основные отличия:
1 - он теперь рабочий :-?
Нет, этот вариант не рабочий.

1. По крайней мере, с теми наборами файлов данных, которые приводились в теме, откуда это всё переползло:

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

[Olej@modules map2]$ java postalCodeParser tmp 
no such file
[Olej@modules map2]$ java postalCodeParser tmp.csv
no such file

Скопировав ваш старый bbb.csv и переименовав его в ab1.csv, получаю результат:

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

[Olej@modules map2]$ java postalCodeParser ./tmp.csv
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AE   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
И по коду судя, вещественные координаты x & y там не могут читаться, и там будут 0.0.

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

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

Re: java.выбор_коллекции

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

yko писал(а): дальше я хочу сделать следующее:
создать новую коллекцию, где я буду держать данные в сл.формате:
AB21 (тримается пробел и все что после него) AVG(x) AVG(y)

то есть мне понадобится итератор и выборка данных из коллекции HashMap
Там до "дальше" - ой-ой-ой как далеко :-o
Прежде всего: сделать нормальное чтение данных, и как для подобной структуры задач - обработку всех возможных вариантов неправильных форматов входных данных (отсутствие 2-х double значений, ни одного из таких значений, непреобразуемое значение поля и др., др., др.).
yko писал(а): подскажите, пожалуйста, коллекцию какого класса лучше использовать?
(применение коллекции как таковое это чисто моё желания "поработать" с ними :-))
А по поводу ;-) коллекций?

Контейнерные типы данных (которые в переводе вашей книжки названы коллекции ... возможно и в других источниках Java - так же) - во всех языках программирования примерно одинаковы, их выбор и применение исключительно и только зависит от того, что вы собираетесь с ними делать дальше.
Они все практически одинаковы по функциям... это началось, как мне помнится, с STL (standard template library) C++ в предложениях от компании HP, потом STL переехал в стандарт C++, сейчас его развитие (если оно есть) происходит в составе пакетов Boost.
То же самое коллекции в Java, то же самое - структурные типы: списки, кортежи, хэш-таблицы Python, и т.д.
И везде одно и то же самое: схожий функциональный набор + эффективность зависит от того, что вы с ним будете делать дальше:
- если вам предстоит быстрый произвольный доступ - хорош Vector (как бы он не назывался) и очень плох List;
- если вам предстоит вставлять часто элементы, а тем более, хотя бы редко, но удалять элементы - хорош List и очень плох Vector;
- если вас устраивает работа по порядковым номерам элементов - то вам не нужны никакие Map и хэш-таблицы, хэширование, а если нужен произвольный доступ по значению - то нужны вариации Map;

Но в ваших объяснениях задачи нет ведь внятных описаний: что вы собираетесь делать с данными в контейнере? ;-)
В принципе, почти всегда может быть выбран любой вид коллекции, и в нём выразима задача... только будет это не самым лучшим и не самым понятным образом записано.

Более того, часто использование коллекций вообще не нужно, оно не упрощает описание задачи... разве что создаёт (кажущееся ;-) ) облегчение с динамическими границами массивов.
Если вам не нужна произвольная выборка по ключу, то вообще включайте поле ключа в состав структуры элемента коллекции, а коллекцию делайте просто Vector или ArrayList (что практически одно и то же) ... и то, если вас так уж сильно смущают статические границы массивов.

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

Re: java.выбор_коллекции

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

Olej писал(а): Нет, этот вариант не рабочий.
...
2. Если вы показываете не воспроизводимые результаты, не сопровождая их всеми необходимыми файлами - то обсуждать там дальше нечего.
Я даже, грешным делом, подумал, что вылезла несовместимость дефаултной установки OpenJDK в моём Linux, и, возможно, классического Sun JDK (что бывает крайне редко ... если бывает на сегодня уже вообще).
Повозился и переустановил Sun JDK 1.8.

Смотрим:

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

[Olej@modules map2]$ java -version
java version "1.7.0_71"
OpenJDK Runtime Environment (fedora-2.5.3.0.fc20-x86_64 u71-b14)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
[Olej@modules map2]$ javac postalCodeParser.java
[Olej@modules map2]$ java postalCodeParser ./tmp.csv
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AE   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
[Olej@modules map2]$ ls -l *.class
-rw-rw-r--. 1 Olej Olej  546 янв  5 23:37 Coords.class
-rw-rw-r--. 1 Olej Olej 3910 янв  5 23:37 postalCodeParser.class

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

[Olej@modules map2]$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
[Olej@modules map2]$ javac postalCodeParser.java
[Olej@modules map2]$ java postalCodeParser ./tmp.csv
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AD   0.0   0.0
  AB21 0AB   0.0   0.0
  AB21 0AA   0.0   0.0
  AB21 0AF   0.0   0.0
  AB21 0AE   0.0   0.0
[Olej@modules map2]$ ls -l *.class
-rw-rw-r--. 1 Olej Olej  546 янв  5 23:35 Coords.class
-rw-rw-r--. 1 Olej Olej 3914 янв  5 23:35 postalCodeParser.class
Компиляция различными JDK, видно даже минимальное различие в размерах байт-кодов...
А результат один и идентичный: не работоспособно. :shock:

P.S. По крайней мере, не зря потерянного времени ;-) - и я теперь снова спокоен за идентичность Sun JDK & OpenJDK. :!:

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

Re: java.выбор_коллекции

Непрочитанное сообщение yko » 06 янв 2015, 12:47

У меня результат вопроизводится на обоих машинах: и на работе и дома
Вот сейчас вопроизвел еще раз:

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

$ java -version
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)
$
$ javac -version
javac 1.7.0_72
$
$ md5sum *
d8532a5bb9aa974ca72b142260d6cbb7  ab1.csv
75dec3e54f89d3c3aa1f406971727a65  postalCodeParser.java
82d5434cd6b22b299e3dbf6dc4eec755  tmp
$
$ uname -a
Linux *** 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$
$ javac postalCodeParser.java
$
$ md5sum *
d8532a5bb9aa974ca72b142260d6cbb7  ab1.csv
7141efe430c517b89dcfcc4809448599  Coords.class
a386edc8a4ff1a1a0d3dc2606859240c  postalCodeParser.class
75dec3e54f89d3c3aa1f406971727a65  postalCodeParser.java
82d5434cd6b22b299e3dbf6dc4eec755  tmp
$
$ java postalCodeParser tmp
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AE   57.25942   -2.155969
  AB21 0AF   57.196535   -2.208476
  AB21 0AA   57.260381   -2.156371
  AB21 0AB   57.263426   -2.162932
  AB21 0AD   57.259724   -2.157131
$
Последний раз редактировалось yko 06 янв 2015, 15:37, всего редактировалось 1 раз.

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

Re: java.выбор_коллекции

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

yko писал(а): Вот сейчас вопроизвел еще раз:
А зачем мне ваши md5sum, если вы вообще не привели файлы ab1.csv и tmp? :lol:

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

Re: java.выбор_коллекции

Непрочитанное сообщение yko » 06 янв 2015, 15:32

+tar gz
Вложения
pcs.tar.gz
(4.08 КБ) 278 скачиваний

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

Re: java.выбор_коллекции

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

yko писал(а):+tar gz
Достаточно необычная (любопытная) ситуация: один и тот же код на разных компьютерах (версиях) выполняется по-разному.
И это код на Java!

Проверяю:

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

[Olej@modules pcs]$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
- оригинальные .class их архива .tgz:

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

[Olej@modules pcs]$ java postalCodeParser tmp 
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AD   0.0   0.0
  AB21 0AB   0.0   0.0
  AB21 0AA   0.0   0.0
  AB21 0AF   0.0   0.0
  AB21 0AE   0.0   0.0
- перекомпилирую:

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

[Olej@modules pcs]$ javac postalCodeParser.java 
[Olej@modules pcs]$ java postalCodeParser tmp 
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AD   0.0   0.0
  AB21 0AB   0.0   0.0
  AB21 0AA   0.0   0.0
  AB21 0AF   0.0   0.0
  AB21 0AE   0.0   0.0
Другой компьютер, специально 32-бит (предыдущий 64) и другая версия JDK (и OpenJDK и 1.7):

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

bash-4.2$  java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (fedora-2.5.1.3.fc20-i386 u65-b17)
OpenJDK Server VM (build 24.65-b04, mixed mode)


- оригинальные .class:

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

bash-4.2$ java postalCodeParser tmp
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AE   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
- перекомпилируем:

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

bash-4.2$ javac postalCodeParser.java 
bash-4.2$ java postalCodeParser tmp
AB21 0AA,57.260381,-2.156371,390666,818867
AB21 0AB,57.263426,-2.162932,390271,819207
AB21 0AD,57.259724,-2.157131,390620,818794
AB21 0AE,57.25942,-2.155969,390690,818760
AB21 0AF,57.196535,-2.208476,387501,811768
  AB21 0AE   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
Во всех случаях при парсинге строки ввода получаются сплошные 0-ли ... т.е. он вообще не происходит. :-(

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

Re: java.выбор_коллекции

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

Olej писал(а): Достаточно необычная (любопытная) ситуация: один и тот же код на разных компьютерах (версиях) выполняется по-разному.
И это код на Java!
Это так оставить нельзя! ... :cry:

Но пока я переписал пример:
- вместо набора статических функция определён один тип (класс) Container ... можете определить его наследованием от любого типа коллекции...

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

class Container extends HashMap<String,Coords> {
...
- его конструктор имеет 2 параметра: имя файла разбираемых данных + имя файла шаблонов (префиксов):

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

public Container( String fdata, String ftmp ) {
...
- в main() создаётся 1 такой объект, и ко времени создания он уже содержит ваши распарсенные данные:

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

Container table = new Container( args[ 0 ], args[ 1 ] );
...
- ну и он имеет преобразователь toString() для диагностики целиком контейнера.
- поубирал блоки try "с ресурсами" ... не люблю то, что делается "само" и неподконтрольно, но, главным образом, чтобы это было работоспособно и можно было проверить на более ранних JDK 1.6 и т.п.
- кроме того, теперь в тестовых данных могут быть сколько угодно пустых строк и строк комментариев, начинающихся с # (закрывать отдельные строки на тестировании).

Всё это не принципиально важно, ... сделалось это для того, чтобы проверить в разных системах в чём же разница разбора токенов вашей строки. Хотя пока я сделал разделение токенов по-другому, так что оно работает...
Вложения
pcs.tgz
(7.62 КБ) 277 скачиваний

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

Re: java.выбор_коллекции

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

Olej писал(а): - поубирал блоки try "с ресурсами" ... не люблю то, что делается "само" и неподконтрольно, но, главным образом, чтобы это было работоспособно и можно было проверить на более ранних JDK 1.6 и т.п.

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

[Olej@modules pcs]$ u_n_a_m_e -a
Linux modules.localdomain 3.17.7-200.fc20.x86_64 #1 SMP Wed Dec 17 03:35:33 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[Olej@modules pcs]$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
[Olej@modules pcs]$ javac postalCodeParser.java 
[Olej@modules pcs]$ java postalCodeParser ab2.csv tmp2
7 записей : 
[ 'AB34 0JZ'<57.110642;-2.237447> 'AB21 0AD'<57.259724;-2.157131> 'AB21 0AB'<57.263426;-2.162932> 'AB34 0JY'<57.110198;-2.239244> 'AB21 0AA'<57.260381;-2.156371> 'AB21 0AF'<57.196535;-2.208476> 'AB21 0AE'<57.25942;-2.155969> ]

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

bash-4.2$ u_n_a_m_e -a
Linux notebook.localdomain 3.14.8-200.fc20.i686 #1 SMP Mon Jun 16 22:36:56 UTC 2014 i686 i686 i386 GNU/Linux
bash-4.2$ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (fedora-2.5.1.3.fc20-i386 u65-b17)
OpenJDK Server VM (build 24.65-b04, mixed mode)
bash-4.2$ javac postalCodeParser.java 
bash-4.2$ java postalCodeParser ab2.csv tmp2
7 записей : 
[ 'AB34 0JY'<57.110198;-2.239244> 'AB34 0JZ'<57.110642;-2.237447> 'AB21 0AE'<57.25942;-2.155969> 'AB21 0AF'<57.196535;-2.208476> 'AB21 0AA'<57.260381;-2.156371> 'AB21 0AB'<57.263426;-2.162932> 'AB21 0AD'<57.259724;-2.157131> ]

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

olej@atom:~/2015-WORK/EugeneJava/examples.draft/pcs$ u_n_a_m_e -a
Linux atom 2.6.32-45-generic #100-Ubuntu SMP Wed Nov 14 10:41:11 UTC 2012 i686 GNU/Linux
olej@atom:~/2015-WORK/EugeneJava/examples.draft/pcs$ java -version
java version "1.6.0_33"
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.10.04)
OpenJDK Server VM (build 23.25-b01, mixed mode)
olej@atom:~/2015-WORK/EugeneJava/examples.draft/pcs$ javac postalCodeParser.java 
olej@atom:~/2015-WORK/EugeneJava/examples.draft/pcs$ java postalCodeParser ab2.csv tmp2
7 записей : 
[ 'AB34 0JY'<57.110198;-2.239244> 'AB34 0JZ'<57.110642;-2.237447> 'AB21 0AE'<57.25942;-2.155969> 'AB21 0AF'<57.196535;-2.208476> 'AB21 0AA'<57.260381;-2.156371> 'AB21 0AB'<57.263426;-2.162932> 'AB21 0AD'<57.259724;-2.157131> ]
Легко видеть:
- здесь и 32-бит и 64-бит ...
- и ядра Linux от 2.6.32 до 3.17 ...
- и дистрибутивы от Fedora до Ubuntu ...
А результаты совершенно идентичные и верные.

Осталось разобраться в чём может выражаться разница в работе итератора Scanner.

Ответить

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

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

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