Сделал настраиваемый поиск(не только по фамилии, и сортировка тоже настраивается). Вот метод:
public <T>boolean searchBy(Comparator<Person> comp, Function<Person, T> getControlPerson, Function<String, T> getControlConsole, String controlName) {
if(dataBase == null) {
throw new IllegalStateException();
}
Scanner in = new Scanner(System.in);
System.out.print("Запишите " + controlName + ", по которому(ой) будет производиться поиск: ");
T control = getControlConsole.apply(in.nextLine());
ArrayList<Person> found = new ArrayList<Person>();
dataBase.forEach(a -> {
if(getControlPerson.apply(a).equals(control)){
found.add(a);
}
});
if(found.isEmpty()) {
System.out.println("В базе данных нет записей, удовлетворяющих условию");
return false;
} else {
System.out.println("Поиск дал следующие результаты: ");
found.sort(comp);
found.forEach(System.out::println);
return true;
}
}
Этот метод находится в классе PersonDatabase:
class PersonDatabase{
private ArrayList<Person> dataBase;
public boolean showDatabase() {
if(dataBase == null) {
return false;
}
dataBase.forEach(System.out::println);
return true;
}
//здесь searchBy();
@SuppressWarnings("resource")
public boolean getDatabaseFromFile() throws FileNotFoundException {
File inFile;
Scanner fileScanner;
Scanner put = new Scanner(System.in);
System.out.print("Из какого файла загрузить: ");
try{
inFile = new File(put.nextLine());
System.out.println();
} catch(NullPointerException n) {
System.err.println("Такого файла не существует");
return false;
}
dataBase = new ArrayList<Person>(100);
fileScanner = new Scanner(new FileInputStream(inFile));
int lineNumber = 1;
try {
while(fileScanner.hasNextLine()) {
dataBase.add(Person.parse(fileScanner.nextLine()));
lineNumber++;
}
} catch(IllegalArgumentException e) {
System.err.println(e.getMessage() + " Строка " + lineNumber + " не отвечает стандартам");
}
return true;
}
}
Класс Person(оставил только добавленное, чтобы было понятно):
class Person implements Serializable {
//...
public static Person parse(String string) {
String[] parts = string.split(" ");
if(parts.length != 4) {
throw new IllegalArgumentException("Всего элементов в строке должно быть 4!");
}
if(!isDate(parts[3])) {
throw new IllegalArgumentException("Дата записана неверно!");
}
return new Person(parts[0], parts[1], parts[2], parts[3]);
}
private static boolean isDate(String date) {
return date.length() == 2 + 1 + 2 + 1 + 4 &&
isNumber(date.substring(0, 2)) &&
date.charAt(2) == '.' &&
isNumber(date.substring(3, 5)) &&
date.charAt(5) == '.' &&
isNumber(date.substring(6, 10));
}
private static boolean isNumber(String string) {
for(char ch : string.toCharArray()) {
if(!isNumber(ch)) {
return false;
}
}
return true;
}
private static boolean isNumber(char ch) {
return ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' ||
ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9';
}
public int compareBySurname(Person p) {
return Surname.compareTo(p.Surname);
}
public int compareByDate(Person p) {
int myYear = Integer.parseInt(age.substring(6, 10));
int pYear = Integer.parseInt(p.age.substring(6, 10));
int myMonth = Integer.parseInt(age.substring(3, 5));
int pMonth = Integer.parseInt(age.substring(3, 5));
int myDay = Integer.parseInt(age.substring(0, 2));
int pDay = Integer.parseInt(age.substring(0, 2));
if(myYear > pYear) {
return -1;
} else if(myYear == pYear) {
if(myMonth > pMonth) {
return -1;
} else if(myMonth == pMonth) {
return pDay - myDay;
} else {
return 1;
}
} else {
return 1;
}
}
//...
}
Замечу, что вы забыли поля сделать private – иначе зачем вы get-еры и set-еры делали.
Переходим к тестам этого дела.
Метод main(поиск по фамилии, сортировка по дате):
PersonDatabase database = new PersonDatabase();
database.getDatabaseFromFile();
database.<String>searchBy(Person::compareByDate,
(Person a) -> a.Surname,
(String a) -> a,
"фамилию");
Содержимое файла(Persons.txt), используемого при тесте:
a c c 12.12.2019
a b c 03.03.2012
a c c 12.12.2012
a r c 02.03.2012
Сам тест(консоль):
Из какого файла загрузить: Persons.txt
Запишите фамилию, по которому(ой) будет производиться поиск: c
Поиск дал следующие результаты:a c c
12.12.2019a c c
12.12.2012
Метод putPersonsInFileWithConsole из класса PersonDatabase:
public static boolean putPersonsInFileWithConsole() throws IOException {
PrintWriter printWriter;
File inFile;
Scanner put = new Scanner(System.in);
System.out.print("В какой файл добавлять: ");
try{
inFile = new File(put.nextLine());
System.out.println();
} catch(NullPointerException n) {
System.err.println("Такого файла не существует");
return false;
}
BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(inFile, true));
String inLine = null;
System.out.println("Чтобы выйти - напечатайте слово 'выйти'");
do {
System.out.println("Введите информацию о человеке в следующем формате: 'имя фамилия отчество дата_рождения(**.**.****):'");
inLine = put.nextLine();
if(inLine.equals("выйти")) {
break;
}
String[] parts = inLine.split(" ");
if(parts.length != 4) {
System.err.println("Всего элементов в строке должно быть 4!");
continue;
}
if(!Person.isDate(parts[3])) {
System.err.println("Дата записана неверно!");
continue;
}
bufferWriter.newLine();
bufferWriter.write(inLine);
bufferWriter.flush();
} while(true);
bufferWriter.close();
return true;
}
IP Geolocation API Java SDK
Introduction
IPGeolocation API is the solution to identify country code (ISO2 and ISO3 standard), country
name, continent code, continent name, country capital, state/province, district, city, zip code, latitude and longitude
of city, is country belongs to Europian Union, calling code, top level domain (TLD), languages, country flag, internet
service provider (ISP), connection type, organization, geoname ID, currency code, currency name, time zone ID, time zone
offset, current time in the time zone, is time zone in daylight saving time, total daylight savings and user agent
details. This document provides important information to help you get up to speed with IPGeolocation API using IP
Geolocation API Java SDK.
Developers can use this Java SDK for software and web projects related to, but not limited to:
- Display native language and currency
- Redirect based on the country
- Digital rights management
- Web log stats and analysis
- Auto-selection of country, state/province and city on forms
- Filter access from countries you do not do business with
- Geo-targeting for increased sales and click-through
Quick Start Guide
You need a valid ‘IPGeolocation API key’ to use this SDK. Sign up here and get your
free API key if you don’t have one.
Note: Complete documentation to use this SDK is also available
at IP Geolocation API JAVA SDK Documentation
.
System Requirements
IP Geolocation API Java SDK has been developed and tested on JDK version 8.
Note: Internet connection is required to run this component.
Installation
Our Java SDK can be installed by various methods given below:
Maven
Add the following dependency in ‘pom.xml’ file to use the IP Geolocation API Java SDK.
<dependency>
<groupId>io.ipgeolocation</groupId>
<artifactId>ipgeolocation</artifactId>
<version>1.0.13</version>
</dependency>
Gradle
Add the following dependency in ‘build.gradle’ file to use the IP Geolocation API Java SDK.
repositories { ... maven { url "http://dl.bintray.com/ipgeolocation/ipgeolocation" } } dependencies { compile 'io.ipgeolocation:ipgeolocation:1.0.13' ... }
Ivy
Add the following dependency code in ‘ivy.xml’ file to use the IP Geolocation API Java SDK.
<dependency org='io.ipgeolocation' name='ipgeolocation' rev='1.0.13'> <artifact name='ipgeolocation' /> </dependency>
JAR File
Use the following URL to download the latest JAR file for IP Geolocation API Java SDK.
- https://ipgeolocation.io/downloads/ip-geolocation-api-java-1.0.13.jar
Documentation
Use the following URL to visit documentation
- https://ipgeolocation.io/documentation.html
Basic Usage
Setup API
// Create IPGeolocationAPI object, passing your valid API key IPGeolocationAPI api=new IPGeolocationAPI("YOUR_API_KEY");
Geolocation Lookup
// Get geolocation for IP address (1.1.1.1) and fields (geo, time_zone and currency) GeolocationParams geoParams = new GeolocationParams(); geoParams.setIPAddress("1.1.1.1"); geoParams.setFields("geo,time_zone,currency"); geoParams.setIncludeSecurity(true); Geolocation geolocation = api.getGeolocation(geoParams); // Check if geolocation lookup was successful if (geolocation.getStatus() == 200) { System.out.println(geolocation.getCountryName()); System.out.println(geolocation.getCurrency().getName()); System.out.println(geolocation.getTimezone().getCurrentTime()); System.out.println(geolocation.getGeolocationSecurity().getAnonymous()); System.out.println(geolocation.getGeolocationSecurity().getKnownAttacker()); System.out.println(geolocation.getGeolocationSecurity().getProxy()); System.out.println(geolocation.getGeolocationSecurity().getProxyType()); System.out.println(geolocation.getGeolocationSecurity().getAnonymous()); System.out.println(geolocation.getGeolocationSecurity().getCloudProvider()); System.out.println(geolocation.getUserAgent().getDevice().getName()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); } // Get geolocation in Russian** for IP address (1.1.1.1) and all fields GeolocationParams geoParams = new GeolocationParams(); geoParams.setIPAddress("1.1.1.1"); geoParams.setLang("ru"); Geolocation geolocation = api.getGeolocation(geoParams); // Check if geolocation lookup was successful if (geolocation.getStatus() == 200) { System.out.println(geolocation.getIPAddress()); System.out.println(geolocation.getCountryName()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); } // Get geolocation for the calling machine's IP address for all fields Geolocation geolocation = api.getGeolocation(); if (geolocation.getStatus() == 200) { System.out.println(geolocation.getCountryCode2()); System.out.println(geolocation.getTimezone().getCurrentTime()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); }
Bulk Geolocations Lookup
// Query geolocation in German** for multiple IP addresses and all fields String[] ips = new String[]{"1.1.1.1","2.2.2.2","3.3.3.3"}; GeolocationParams geoParams = new GeolocationParams(); geoParams.setIPAddresses(ips); geoParams.setLang("de"); List<Geolocation> geolocations = api.getBulkGeolocation(geoParams); System.out.println(geolocations.size()); System.out.println(geolocations.get(0).getCountryName()); System.out.println(geolocations.get(1).getLanguages()); System.out.println(geolocations.get(2).getTimezone().getCurrentTime()); // Query geolocations for multiple IP addresses but only geo field String[] ips = new String[]{"1.1.1.1","2.2.2.2","3.3.3.3"}; GeolocationParams geoParams = new GeolocationParams(); geoParams.setIPAddresses(ips); geoParams.setFields("geo"); List<Geolocation> geolocations = api.getBulkGeolocation(geoParams); System.out.println(geolocations.size()); System.out.println(geolocations.get(0).getCountryCode2()); System.out.println(geolocations.get(1).getCountryName()); System.out.println(geolocations.get(2).getLatitude());
Timezone API
// Get time zone information by time zone ID TimezoneParams tzParams = new TimezoneParams(); tzParams.setTimezone("America/New_York"); Timezone tz = api.getTimezone(tzParams); if (tz.getStatus() == 200) { System.out.println(tz.getDateTimeWti()); System.out.println(tz.getDateTimeTxt()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); } // Get time zone information by coordinates (latitude and longitude) of the location TimezoneParams tzParams = new TimezoneParams(); tzParams.setCoordinates(37.1838139,-123.8105225); Timezone tz = api.getTimezone(tzParams); if (tz.getStatus() == 200) { System.out.println(tz.getTimezone()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); } // Get time zone information for IP address (1.1.1.1) and geolocation information Japanese** TimezoneParams tzParams = new TimezoneParams(); tzParams.setIPAddress("1.1.1.1"); tzParams.setLang("ja"); Timezone tz = api.getTimezone(tzParams); if (tz.getStatus() == 200) { System.out.println(tz.getTimezone()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); } // Query time zone information for calling machine's IP address Timezone tz = api.getTimezone(); if(tz.getMessage()){ System.out.println(tz.getTimezone()); System.out.println(tz.getDateTimeYmd()); } else { System.out.printf("Status Code: %d, Message: %sn", geolocation.getStatus(), geolocation.getMessage()); }
** IPGeolocation provides geolocation information in the following languages:
- English (en)
- German (de)
- Russian (ru)
- Japanese (ja)
- French (fr)
- Chinese Simplified (cn)
- Spanish (es)
- Czech (cs)
- Italian (it)
By default, geolocation information is returned into English. Response in a language other than English is available to
paid users only.
IP Geolocation API Java SDK Objects Reference
IP Geolocation API Java SDK has the following classes that you can use to fully leverage it.
Class: io.ipgeolocation.api.IPGeolocationAPI
Method | Description | Return Type |
---|---|---|
IPGeolocationAPI(String apiKey) throws IllegalArgumentException | Constructs the IPGeolocationAPI object. It takes a valid apiKey as a parameter and throws IllegalArgumentException if apiKey is empty or null. | |
getApiKey() | This function to get the API key that you set to query the IPGeolocation API. | String |
getGeolocation() | This function to query Geolocation API. | Map<String, Object> |
getGeolocation(GeolocationParams params) | This function to query Geolocation API based on the parameters passed. | Map<String, Object> |
getBulkGeolocation(GeolocationParams params) | This function to query Geolocation API to lookup multiple IP addresses (max. 50). | Map<String, Object> |
getTimezone() | This function to query Timezone API based on calling machine’s IP address. | Map<String, Object> |
getTimezone(TimezoneParams params) | This function to query Timezone API based on the parameters passed. | Map<String, Object> |
getUserAgent(String uaString) | This function to query UserAgent API. | Map<String, Object> |
getBulkUserAgent(List uaStrings) | This function to query UserAgent API to lookup multiple user-agent strings (max. 50). | Map<String, Object> |
Class: io.ipgeolocation.api.GeolocationParams
Method | Description | Return Type |
---|---|---|
setIPAddress(String ip) | Sets IP address to lookup geolocation. | void |
getIPAddress() | Get IP address set to lookup geolocation. | String |
setIPAddresses(String[] ips) throws IllegalArgumentException | Set IP addresses to lookup multiple geo-locations. Throws IllegalArgumentException if no. of IP addresses are more than 50. ** | |
Note:** Multiple IP addresses lookup is only available for paid users. | void | |
getIPAddresses() | Get IP addresses set to lookup bulk geolocations. | String[] |
setLang(String lang) | Set language parameter to lookup geolocation. | void |
getLang() | Get language set to lookup geolocation. | String |
setFields(String fields) | Set fields to lookup geolocation. | void |
getFields() | Get fields set to lookup geolocation. | String |
setIncludeHostname(Boolean includeHostname) | This URL parameter enables the IPGeolocation API to lookup hostname from our IP-Hostname database and returns the same IP address if there is no hostname found for the queried IP address. Lookup thru IP-Hostname database is faster than other options but is experimental and under process and can produce unwanted output. | void |
isIncludeHostname() | Returns Boolean object whether hostname is included in response or not. | Boolean |
setIncludeHostnameFallbackLive(Boolean includeHostnameFallbackLive) | This URL parameter enables the IPGeolocation API to lookup hostname from our IP-Hostname database and if there is no hostname found for the queried IP address, then lookup thru the live sources. This option has been introduced for faster and accurate lookup. | void |
isIncludeHostnameFallbackLive() | Returns Boolean object whether hostname with fall-back-live is included in response or not. | Boolean |
setIncludeLiveHostname(Boolean includeLiveHostname) | This URL parameter enables the IPGeolocation API to lookup hostname from live sources. Lookup thru live sources is accurate but can introduce more latency to your query to IPGeolocation API. | void |
isIncludeLiveHostname() | Returns Boolean object whether live hostname is included in response or not. | Boolean |
setIncludeSecurity(Boolean includeSecurity) | Set includeSecurity to true to get Security object as well. | void |
isIncludeSecurity() | Returns Boolean object whether Security object is included in response or not. | Boolean |
setIncludeUserAgentDetail(Boolean includeUserAgentDetail) | Set includeUserAgentDetail to true to get UserAgent object as well. | void |
isIncludeUserAgentDetail() | Returns Boolean object whether UserAgent object is included in response or not. | Boolean |
setExcludes(String excludes) | Set fields (as a comma separated value) to exclude from response. | void |
getExcludes() | Get fields (as a comma separated value) that have been excluded from response. | String |
Class: io.ipgeolocation.api.Geolocation
Method | Description | Return Type |
---|---|---|
getDomain() | Returns domain name if domain name is passed. | String |
getHostname() | Returns hostname for the IP address. | String |
getIPAddress() | Returns IP address of the geolocation. | String |
getContinentCode() | Returns 2-letters continent code. | String |
getContinentName() | Returns continent name. | String |
getCountryCode2() | Returns 2-letters country code. | String |
getCountryCode3() | Returns 3-letters country code. | String |
getCountryName() | Returns country name. | String |
getCountryCapital() | Returns country capital. | String |
getStateProvince() | Returns state/province. | String |
getDistrict() | Returns district. | String |
getCity() | Returns city. | String |
getZipCode() | Returns zip code. | String |
getLatitude() | Returns latitude of the city. | Double |
getLongitude() | Returns longitude of the city. | Double |
isEU() | Returns is the country in European Union. | Boolean |
getCallingCode() | Returns country calling code. | String |
getCountryTLD() | Returns country’s top level domain like ‘.au’ for Australia. | String |
getLanguages() | Returns languages spoken in the country. | String |
getCountryFlag() | Returns a URL to country’s flag. | String |
getISP() | Returns ISP name. | String |
getConnectionType() | Returns connection type of the IP address. | String |
getOrganization() | Returns organization of the IP address. | String |
getAsn() | Returns AS number of the IP address. | String |
getGeonameID() | Returns geoname ID from geonames.org database. | String |
getCurrency() | Returns currency information of the country. | GeolocationCurrency |
getTimezone() | Returns time zone information of the country. | GeolocationTimezone |
getGeolocationSecurity() | Returns security details of the ip address. | GeolocationSecurity |
getUserAgent() | Returns user agent information of the country. | UserAgent |
Class: io.ipgeolocation.api.GeolocationCurrency
Method | Description | Return Type |
---|---|---|
getName() | Returns currency name. | String |
getCode() | Returns 3-letters currency code. | String |
getSymbol() | Returns currency symbol. | String |
Class: io.ipgeolocation.api.GeolocationTimezone
Method | Description | Return Type |
---|---|---|
getName() | Returns standard time zone ID like “America/New_York”. | String |
getOffset() | Returns time zone offset from UTC. | Integer |
getCurrentTime() | Returns current date-time string in the format “yyyy-MM-dd HH:mm:ss.SSSZ” | String |
getCurrentTimeUnix() | Returns current date-time as a unix time | BigDecimal |
isDST() | Returns is the country observing daylight saving time. | Boolean |
getDSTSavings() | Returns daylight savings time (in hours). | Integer |
Class: io.ipgeolocation.api.GeolocationSecurity
Method | Description | Return Type |
---|---|---|
getThreatScore() | Returns threat score for the ip address | Integer |
isTor() | Returns Boolean object whether the ip is using tor or not. | Boolean |
isProxy() | Returns Boolean object whether the ip is using proxy or not. | Boolean |
getProxyType() | Returns the type of proxy used by ip address | String |
isAnonymous() | Returns Boolean object whether the ip is anonymous or not. | Boolean |
isKnownAttacker() | Returns Boolean object whether the ip is known attacker or not. | Boolean |
isBot() | Returns Boolean object whether the ip is bot or not. | Boolean |
isSpam() | Returns Boolean object whether the ip is spam or not. | Boolean |
isCloudProvider() | Returns Boolean object whether the ip is cloud provider or not. | Boolean |
Class: io.ipgeolocation.api.TimezoneParams
Method | Description | Return Type |
---|---|---|
setTimezone(String timezone) | Sets time zone ID to query time zone information. | void |
getTimezone() | Get time zone ID set to query time zone information. | String |
setIPAddress(String ip) | Sets IP address to query time zone information. | void |
getIPAddress() | Get IP address set to query time zone information. | String |
setCoordinates(Double latitude, Double longitude) | Sets latitude and longitude of a location to query time zone information. | void |
getLatitude() | Returns latitude set to query time zone information. | Double |
getLongitude() | Returns longitude set to query time zone information. | Double |
setLocation(String location) | Set location parameter to get timezone details. | void |
getLocation() | Get location parameter value to get timezone details. | String |
setLang(String lang) | Set language parameter to lookup geolocation. Default is ‘en’. | void |
getLang() | Get language set to lookup geolocation. | String |
Class: io.ipgeolocation.api.Timezone
Method | Description | Return Type |
---|---|---|
getTimezone() | Returns time zone ID like “America/New_York”. | String |
getTimezoneOffset() | Returns time zone offset from UTC. | Integer |
getTimezoneOffsetWithDST() | Returns time zone offset with dst value from UTC. | Integer |
getDate() | Returns current date in the format “yyyy-MM-dd”. | String |
getDateTime() | Returns date-time string in the format “yyyy-MM-dd HH:mm:ss”. | String |
getDateTimeTxt() | Returns date-time string in the format “EEEE, MMMM dd, yyyy HH:mm:ss”. | String |
getDateTimeWti() | Returns date-time string in the format “EEE, dd MMM yyyy HH:mm:ss Z”. | String |
getDateTimeYmd() | Returns date-time string in the format “yyyy-MM-dd’T’HH:mm:ssZ”. | String |
getDateTimeUnix() | Returns current date-time as unix time. | BigDecimal |
getTime24() | Returns current time in the format “HH:mm:ss”. | String |
getTime12() | Returns current time in the format “hh:mm:ss aa”. | String |
getWeek() | Returns current week of the year. | Integer |
getMonth() | Returns current month of the year. | Integer |
getYear() | Returns current year. | Integer |
getYearAbbr() | Returns 2-letters year abbreviation like “18”. | String |
isDST() | Returns is the country observing Daylight Saving time. | Boolean |
getDSTSavings() | Returns daylight savings time (in hours). | Integer |
getTimezoneGeo() | Returns geolocation of timezone if you lookup timezone information from an IP address. | TimezoneGeo |
Class: io.ipgeolocation.api.TimezoneGeo
Method | Description | Return Type |
---|---|---|
getCountryCode2() | Returns 2-letters country code. | String |
getCountryCode3() | Returns 3-letters country code. | String |
getCountryName() | Returns country name. | String |
getStateProvince() | Returns state/province. | String |
getDistrict() | Returns district. | String |
getCity() | Returns city. | String |
getZipCode() | Returns zip code. | String |
getLatitude() | Returns latitude of the city. | BigDecimal |
getLongitude() | Returns longitude of the city. | BigDecimal |
Class: io.ipgeolocation.api.UserAgent
Method | Description | Return Type |
---|---|---|
getUserAgentString() | Returns user-agent string. | String |
getName() | Returns name of the user agent. | String |
getType() | Returns type of the user agent. | String |
getVersion() | Returns version of the user agent. | String |
getVersionMajor() | Returns version major of the user agent. | String |
getDevice() | Returns user-agent’s device details. | UserAgentDevice |
getEngine() | Returns user-agent’s engine details. | UserAgentEngine |
getOperatingSystem() | Returns user-agent’s operating system details. | UserAgentOperatingSystem |
Class: io.ipgeolocation.api.UserAgentDevice
Method | Description | Return Type |
---|---|---|
getName() | Returns user-agent’s device name. | String |
getType() | Returns user-agent’s type name. | String |
getBrand() | Returns user-agent’s brand name. | String |
getCpu() | Returns user-agent’s CPU name. | String |
Class: io.ipgeolocation.api.UserAgentEngine
Method | Description | Return Type |
---|---|---|
getName() | Returns user-agent’s engine name. | String |
getType() | Returns user-agent’s engine type. | String |
getVersion() | Returns user-agent’s engine version. | String |
getVersionMajor() | Returns user-agent’s engine version major. | String |
Class: io.ipgeolocation.api.UserAgentOperatingSystem
Method | Description | Return Type |
---|---|---|
getName() | Returns user-agent’s operating system name. | String |
getType() | Returns user-agent’s operating system type. | String |
getVersion() | Returns user-agent’s operating system version. | String |
getVersionMajor() | Returns user-agent’s operating system version major. | String |
Время на прочтение
1 мин
Количество просмотров 27K
Спешу поделиться с вами своею радостью 🙂 Столкнулся я тут недавно с задачкой — нужно было определить местонахождения лиц на картинке.
Зачем это нужно — другой вопрос: мне, лично, понадобилось для создания модели распределения внимания по картинке, а кому-то, может быть, нужно для того, чтобы людей как в фейсбуке автоматически на групповой фотографии выделять.
Алгоритмы, в принципе, неплохо известны. Одним из лучших является алгоритм Viola & Jones, но поиск готовых имплементаций результатов не принёс. Было расстроился, но обратил внимание на замечательную нативную библиотеку — OpenCV. Библиотека ценна не только реализацией основных алгоритмов компьютерного зрения, но тем, что встречается решительно на всех платформах.
И что же вы думаете? Одним из первых в гугле выпадает вот такой замечательный проект JNI интерфейса к OpenCV!
Несколько минут закачки, десяток минут чтения документации с установкою программы, и ещё десяток — написание теста. А потом, и вот этими четырьмя строчками, просто берём и распознаём на картинке лица!
OpenCV cv = new OpenCV();
cv.loadImage("test.jpg", 300, 400);
cv.cascade("haarcascade_frontalface_default.xml");
Rectangle bounds[] = cv.detect();
Насколько я понял, JNI интерфейс написал Bryan Chung для языка Processing (кстати, на его сайте выложено видео — иллюстрация работы программы), а код был потом доработан и выложен на Atelier hypermédia под BSD license.
I’m pretty new to Java, and I’ve been having a problem searching for a person in my Binary Tree. I want it so that what number is entered will bring up that person (User ID, Name etc.).
So far, this is what I have:
BinaryTree Tree = new BinaryTree();
BinaryNode NodeAt;
int TypeIn;
Scanner user_input = new Scanner(System.in);
Person PersonA = new Person(1,"PersonFirstName","PersonLastName","PersonPassword");
//Above repeated but PersonA becomes PersonB etc.
Tree.Insert(PersonA);
//Above repeated but PersonA becomes PersonB etc.
Tree.InOrder(MyTree.gRoot());
TypeIn = user_input.nextInt()
if (TypeIn == 1) {
NodeAt = MyTree.Find(PersonA);
System.out.println("NodeAt.gKey());
}
// Repeat for other people (1 becomes 2, PersonA becomes Person B etc.)
There is also a Person class that is linked to this.
I was mostly curious if there is an easier or more suitable way to show the users. I don’t really want to copy the if statement (if (TypeIn == 1))
and change the TypeIn to 2, 3, 4, 5 etc and PersonA to PersonB. It does work that way, just want to try and be neater and learn other ways.
Геолокация по IP в Java
1. Вступление
В этой статье мы рассмотрим, как получить данные о географическом местоположении с IP-адреса с помощью Java API MaxMind GeoIP2 с бесплатной базой данных GeoLite2.
Мы также увидим это в действии, используя простое демонстрационное веб-приложение Spring MVC.
2. Начиная
Для начала вам необходимо загрузить GeoIP2 API и базу данных GeoLite2 с MaxMind.
2.1. Maven Dependency
Чтобы включить API MaxMind GeoIP2 в свой проект Maven, добавьте в файлpom.xml следующее:
com.maxmind.geoip2
geoip2
2.8.0
Чтобы получить последнюю версию API, вы можете найти ее наMaven Central.
2.2. Скачивание базы данных
Затем вам нужно скачатьGeoLite2 database. Для этого урока мы используем бинарную версию базы данных GeoLite2 City в сжатом виде.
После распаковки архива у вас будет файл с именемGeoLite2-City.mmdb. Это база данных сопоставлений IP-адресов в собственном двоичном формате MaxMind.
3. Использование API Java GeoIP2
Давайте воспользуемся Java API GeoIP2, чтобы получить данные о местоположении для данного IP-адреса из базы данных. Во-первых, давайте создадимDatabaseReader для запроса базы данных:
File database = new File(dbLocation);
DatabaseReader dbReader = new DatabaseReader.Builder(database).build();
Затем давайте воспользуемся методомcity() для получения данных о городе для IP-адреса:
CityResponse response = dbReader.city(ipAddress);
ОбъектCityResponse содержит несколько частей информации, кроме названия города. Вот пример теста JUnit, показывающий, как открыть базу данных, получить информацию о городе для IP-адреса и извлечь эту информацию изCityResponse:
@Test
public void givenIP_whenFetchingCity_thenReturnsCityData()
throws IOException, GeoIp2Exception {
String ip = "your-ip-address";
String dbLocation = "your-path-to-mmdb";
File database = new File(dbLocation);
DatabaseReader dbReader = new DatabaseReader.Builder(database)
.build();
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = dbReader.city(ipAddress);
String countryName = response.getCountry().getName();
String cityName = response.getCity().getName();
String postal = response.getPostal().getCode();
String state = response.getLeastSpecificSubdivision().getName();
}
4. Использование GeoIP в веб-приложении
Рассмотрим пример веб-приложения, которое извлекает данные о геолокации с общедоступного IP-адреса пользователя и отображает его местоположение на карте.
Начнем сbasic Spring Web MVC Application. Затем мы напишемController, который принимает IP-адрес в запросе POST и возвращает ответ JSON, содержащий город, широту и долготу, полученные из API GeoIP2.
Наконец, мы напишем некоторые HTML и JavaScript, которые загрузят общедоступный IP-адрес пользователя в форму, отправят запрос Ajax POST в нашController и отобразят результат в Google Maps.
4.1. Класс сущности ответа
Начнем с определения класса, который будет содержать ответ геолокации:
public class GeoIP {
private String ipAddress;
private String city;
private String latitude;
private String longitude;
// constructors, getters and setters...
}
4.2. Сервисный класс
Теперь давайте напишем сервисный класс, который извлекает данные геолокации с помощью Java API GeoIP2 и базы данных GeoLite2:
public class RawDBDemoGeoIPLocationService {
private DatabaseReader dbReader;
public RawDBDemoGeoIPLocationService() throws IOException {
File database = new File("your-mmdb-location");
dbReader = new DatabaseReader.Builder(database).build();
}
public GeoIP getLocation(String ip)
throws IOException, GeoIp2Exception {
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = dbReader.city(ipAddress);
String cityName = response.getCity().getName();
String latitude =
response.getLocation().getLatitude().toString();
String longitude =
response.getLocation().getLongitude().toString();
return new GeoIP(ip, cityName, latitude, longitude);
}
}
4.3. Контроллер Spring
Давайте посмотрим наController для Spring MVC, который отправляет параметр запроса ipAddress в наш класс обслуживания, чтобы получить данные ответа геолокации:
@RestController
public class GeoIPTestController {
private RawDBDemoGeoIPLocationService locationService;
public GeoIPTestController() throws IOException {
locationService = new RawDBDemoGeoIPLocationService();
}
@PostMapping("/GeoIPTest")
public GeoIP getLocation(
@RequestParam(value="ipAddress", required=true) String ipAddress
) throws Exception {
GeoIPLocationService locationService
= new RawDBDemoGeoIPLocationService();
return locationService.getLocation(ipAddress);
}
}
4.4. Форма HTML
Давайте добавим интерфейсный код для вызова нашей SpringController,, начиная с HTML-формы, содержащей IP-адрес:
4.5. Загрузка общедоступного IP-адреса на клиенте
Теперь давайте предварительно заполним текстовое поле ipAddress общедоступным IP-адресом пользователя с помощью jQuery и JavaScript APIipify.org:
4.6. Отправка запроса Ajax POST
Когда форма будет отправлена, мы сделаем запрос Ajax POST к SpringController, чтобы получить ответ JSON с данными геолокации:
$( "#ipForm" ).submit(function( event ) {
event.preventDefault();
$.ajax({
url: "GeoIPTest",
type: "POST",
contentType:
"application/x-www-form-urlencoded; charset=UTF-8",
data: $.param( {ipAddress : $("#ip").val()} ),
complete: function(data) {},
success: function(data) {
$("#status").html(JSON.stringify(data));
if (data.ipAddress !=null) {
showLocationOnMap(data);
}
},
error: function(err) {
$("#status").html("Error:"+JSON.stringify(data));
},
});
});
4.7. Пример ответа JSON
Ответ JSON от нашего SpringController будет иметь следующий формат:
{
"ipAddress":"your-ip-address",
"city":"your-city",
"latitude":"your-latitude",
"longitude":"your-longitude"
}
4.8. Отображение местоположения на Google Maps
Для отображения местоположения на Google Maps вам необходимо включить Google Maps API в свой HTML-код:
Вы можете получить ключ API для Карт Google с помощью консоли разработчика Google.
Вам также необходимо определить HTML-тег<div>, содержащий изображение карты:
Вы можете использовать следующую функцию JavaScript для отображения координат на Картах Google:
function showLocationOnMap (location) {
var map;
map = new google.maps.Map(document.getElementById('map'), {
center: {
lat: Number(location.latitude),
lng: Number(location.longitude)},
zoom: 15
});
var marker = new google.maps.Marker({
position: {
lat: Number(location.latitude),
lng: Number(location.longitude)},
map: map,
title:
"Public IP:"+location.ipAddress
+" @ "+location.city
});
}
После запуска веб-приложения откройте URL-адрес страницы карты:
http://localhost:8080/spring-mvc-xml/GeoIpTest.jsp
Вы увидите текущий публичный IP-адрес для вашего соединения, загруженный в текстовое поле:
Обратите внимание, что и GeoIP2, и ipify поддерживают адреса IPv4, а также адреса IPv6.
При отправке формы вы увидите текст ответа JSON, включая город, широту и долготу, соответствующие вашему общедоступному IP-адресу, а под ним вы увидите карту Google, указывающую на ваше местоположение:
5. Заключение
В этом руководстве мы рассмотрели использование Java API MaxMind GeoIP2 и бесплатную базу данных MaxMind GeoLite2 City с использованием теста JUnit.
Затем мы создали Spring MVCController и сервис для получения данных геолокации (город, широта, долгота) с IP-адреса.
Наконец, мы создали интерфейс HTML / JavaScript, чтобы продемонстрировать, как эту функцию можно использовать для отображения местоположения пользователя на Картах Google.
Этот продукт включает данные GeoLite2, созданные MaxMind, доступные сhttp://www.maxmind.com.
Код этого руководства можно найти наGithub site.