Поиск с помощью Arrays.binarySearch()
Класс Arrays содержит набор методов с именем binarySearch(). Этот метод поможет вам выполнить бинарный поиск в массиве. Сначала массив должен быть отсортирован. Вы можете сделать это самостоятельно или с помощью метода Arrays.sort(), описанного ранее в этом тексте. Вот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 6); System.out.println(index);
Вторая строка этого примера ищет в массиве значение 6. Метод binarySearch() возвращает индекс в массиве, в котором был найден элемент. В приведенном выше примере метод binarySearch() вернет 3.
Если в массиве существует более одного элемента с искомым значением, нет гарантии, какой элемент будет найден.
Если элемент с данным значением не найден, будет возвращено отрицательное число. Отрицательным числом будет индекс, по которому будет вставлен искомый элемент, а затем минус один. Посмотрите на этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 7); System.out.println(index);
Число 7 не найдено в массиве. Номер 7 должен был быть вставлен в массив по индексу 4, если 7 должен был быть вставлен в массив (и порядок сортировки сохранен). Следовательно, binarySearch() возвращает -4 – 1 = -5.
Если все элементы в массиве меньше искомого значения, то двоичная Search() вернет – длина массива – 1. Посмотрите на этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 12); System.out.println(index);
В этом примере мы ищем 12 в массиве, но все элементы в массиве меньше 12. Поэтому binarySearch() вернет -length(-6) – 1 = -6 -1 = -7.
Метод Arrays.binarySearch() для поиска части массива. Вот как это выглядит:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 0, 4, 2); System.out.println(index);
В этом примере выполняется поиск в массиве значения 2, но только между индексами 0 и 4 (без 4).
Эта версия binarySearch() работает так же, как и другая версия, за исключением случаев:
- Если не найдено ни одного элемента, совпадающего в пределах интервала индекса, то все равно вернется индекс того места, где должно было быть вставлено значение.
- Если все значения в интервале меньше искомого значения, вернется -toIndex -1, а не -array length – 1.
Таким образом, этот пример:
int[] ints = {0,2,4,6,8,10}; int index = Arrays.binarySearch(ints, 0, 4, 12);
вернет -5, а не -7, как в двоичном поиске (целых, 12).
Итерация
Как перебрать все элементы массива, используя цикл Java for:
String[] stringArray = new String; for(int i=0; i < stringArray.length; i++) { stringArray = "String no " + i; } for(int i=0; i < stringArray.length; i++) { System.out.println( stringArray ); }
В этом примере:
- Сначала создается массив ссылок String. Когда впервые создаете массив ссылок на объекты, каждая из ячеек в массиве указывает на ноль, а не на объект.
- Первый из двух циклов for выполняет итерацию по массиву String, создает строку и делает ссылку на ячейку этой строкой.
- Второй из двух циклов for перебирает массив String и печатает все строки, на которые ссылаются ячейки.
Если бы это был массив int (примитивные значения), он мог бы выглядеть так:
int[] intArray = new int; for(int i=0; i < intArray.length; i++) { intArray = i; } for(int i=0; i < intArray.length; i++) { System.out.println( intArray ); }
Переменная i инициализируется равной 0 и работает до длины массива минус 1. В этом случае i принимает значения от 0 до 9, каждый раз повторяя код внутри цикла for один раз, и для каждой итерации i имеет другое значение.
Как перебрать массив с помощью цикла «for-each» в Java. Вот как это выглядит:
int[] intArray = new int; for(int theInt : intArray) { System.out.println(theInt); }
Цикл for-each дает вам доступ к каждому элементу в массиве по одному, но не информацию об индексе каждого элемента. Есть доступ только к значению. Изменить значение элемента в этой позиции невозможно. Если это нужно, используйте обычный цикл for, как показано ранее.
Цикл for-each также работает с массивами объектов. Вот пример, как выполнить итерацию массива объектов String:
String[] stringArray = {"one", "two", "three"}; for(String theString : stringArray) { System.out.println(theString); }
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Начиная с Java 7 , мы познакомились с классом , в котором доступно несколько , таких как , , и среди прочих.
Каждая имеет и метод, который принимает (который , такую же, как ). С практической точки зрения – это означает, что мы можем вставить строку в методы .
Метод возвращает , который мы можем легко снова превратить в строку.
Ранее, когда мы использовали наш метод , мы сохраняли полученные байты в массиве байтов, но при использовании класса все немного по-другому. Сначала нам нужно использовать класс для хранения наших байтов. Затем нам нужно как кодировать , так и декодировать обратно наши недавно выделенные байты. Давайте посмотрим, как это работает в коде:
String japaneseString = "よろしくお願いします"; // Pleased to meet you. ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(japaneseString); String utf8String = new String(byteBuffer.array(), StandardCharsets.UTF_8); System.out.println(utf8String);
Выполнение этого кода приводит к:
よろしくお願いします
Закодируйте строку в UTF-8 с помощью Apache Commons
Пакет кодеков Apache Commons содержит простые кодеры и декодеры для различных форматов, таких как Base64 и Шестнадцатеричный . В дополнение к этим широко используемым кодерам и декодерам, пакет кодеков также поддерживает набор утилит фонетического кодирования .
Чтобы мы могли использовать кодек Apache Commons, нам нужно добавить его в наш проект в качестве внешней зависимости.
Используя Maven, давайте добавим зависимость в ваш файл:
commons-codeccommons-codec1.15
В качестве альтернативы, если вы используете Gradle:
compile 'commons-codec:commons-codec:1.15'
Теперь мы можем использовать служебные классы Apache Commons – и, как обычно, мы будем использовать класс .
Это позволяет нам преобразовывать строки в байты и из байтов, используя различные кодировки, требуемые спецификацией Java. Этот класс является нулевым и потокобезопасным, поэтому у нас есть дополнительный уровень защиты при работе со строками.
Для кодирования строки в UTF-8 с помощью класса Apache Common мы можем использовать метод , который работает так же, как метод с указанной :
String germanString = "Wie heißen Sie?"; // What's your name? byte[] bytes = StringUtils.getBytesUtf8(germanString); String utf8String = StringUtils.newStringUtf8(bytes); System.out.println(utf8String);
Это приводит к:
Wie heißen Sie?
Или , вы можете использовать обычный класс из зависимости:
org.apache.commonscommons-lang3
Если вы используете Gradle:
implementation group: 'org.apache.commons', name: 'commons-lang3', version: ${version}
И теперь мы можем использовать почти тот же подход, что и с обычными строками:
String germanString = "Wie heißen Sie?"; // What's your name? byte[] bytes = StringUtils.getBytes(germanString, StandardCharsets.UTF_8); String utf8String = StringUtils.toEncodedString(bytes, StandardCharsets.UTF_8); System.out.println(utf8String);
Благодаря этому подход является потокобезопасным и нулевым:
Wie heißen Sie?
Вывод
В этом уроке мы рассмотрели как кодировать строку Java в UTF-8 . Мы рассмотрели несколько подходов – ручное создание строки с использованием и управление ими, класс Java 7 , а также Apache Commons.
Копирование
Возможно несколькими способами.
Копирование массива путем итерации массива
Первый способ – это перебрать массив и скопировать каждое значение исходного массива в целевой массив. Вот как выглядит копирование массива с использованием этого метода:
int[] source = new int; int[] dest = new int; for(int i=0; i < source.length; i++) { source = i; } for(int i=0; i < source.length; i++) { dest = source; }
Первые два массива int созданы. Во-вторых, исходный массив инициализируется значениями от 0 до 9 (от 0 до длины массива минус 1). В-третьих, каждый элемент в исходном массиве копируется в целевой массив.
Копирование с помощью Arrays.copyOf()
Вот как выглядит копирование массива:
int[] source = new int; for(int i=0; i < source.length; i++) { source = i; } int[] dest = Arrays.copyOf(source, source.length);
Метод Arrays.copyOf() принимает 2 параметра. Первый – это массив для копирования. Второй – это длина нового массива – можно использовать для указания количества копируемых элементов из исходного массива.
Копирование с использованием Arrays.copyOfRange()
Метод Arrays.copyOfRange() копирует диапазон массива, не обязательно полный массив. Процесс копирования с ним:
int[] source = new int; for(int i=0; i < source.length; i++) { source = i; } int[] dest = Arrays.copyOfRange(source, 0, source.length);
Метод Arrays.copyOfRange() принимает 3 параметра. Первый – это массив для копирования. Второй – это первый индекс в исходном массиве, который нужно включить в копию. Третий – это последний индекс в исходном массиве, который будет включен в копию (исключено – поэтому передача 10 будет копировать до и включая индекс 9).
Массив строк Java в строку
Большую часть времени мы вызываем метод объекта, чтобы получить строковое представление. Давайте посмотрим, что происходит, когда мы вызываем метод для массива строк в java.
package com.journaldev.util; public class JavaStringArrayToString { public static void main(String[] args) { String[] strArr = new String[] {"1","2","3"}; String str = strArr.toString(); System.out.println("Java String array to String = "+str); } }
На рисунке ниже показан результат, полученный вышеуказанной программой.
Причина приведенного выше вывода заключается в том, что вызов массива приведет к суперклассу объектов, где он реализован, как показано ниже.
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
Пример преобразования массива строк Java в строку
Итак, как преобразовать массив строк в строку в java. Мы можем использовать метод , который вызывает метод toString() для отдельных элементов и использует StringBuilder для создания строки.
public static String toString(Object[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append(')); if (i == iMax) return b.append(']').toString(); b.append(", "); } }
Мы также можем создать ваш собственный метод преобразования массива строк в строку, если у нас есть определенные требования к формату.
Ниже приведена простая программа, показывающая эти методы в действии и полученные результаты.
package com.journaldev.util; import java.util.Arrays; public class JavaStringArrayToString { public static void main(String[] args) { String[] strArr = new String[] { "1", "2", "3" }; String str = Arrays.toString(strArr); System.out.println("Java String array to String = " + str); str = convertStringArrayToString(strArr, ","); System.out.println("Convert Java String array to String = " + str); } private static String convertStringArrayToString(String[] strArr, String delimiter) { StringBuilder sb = new StringBuilder(); for (String str : strArr) sb.append(str).append(delimiter); return sb.substring(0, sb.length() - 1); } }
Поэтому, если мы используем метод array , он возвращает бесполезные данные.
Класс массивов Java предоставляет , который выполняет итерацию по элементам массива и использует их реализацию для возврата строкового представления массива. Вот почему, когда мы используем эту функцию, мы видим, что она печатает содержимое массива и может использоваться для ведения журнала.
Если вы хотите объединить все строковые элементы в массиве строк с определенным разделителем, вы можете использовать метод, который возвращает строку после их объединения.
Пример преобразования массива Java в строку
Теперь давайте расширим наш строковый массив до строкового примера для использования с любыми другими пользовательскими классами, вот реализация.
package com.journaldev.util; import java.util.Arrays; public class JavaArrayToString { public static void main(String[] args) { A[] arr = { new A("1"), new A("2"), new A("3") }; // default toString() method System.out.println(arr.toString()); // using Arrays.toString() for printing object array contents System.out.println(Arrays.toString(arr)); // converting Object Array to String System.out.println(convertObjectArrayToString(arr, ",")); } private static String convertObjectArrayToString(Object[] arr, String delimiter) { StringBuilder sb = new StringBuilder(); for (Object obj : arr) sb.append(obj.toString()).append(delimiter); return sb.substring(0, sb.length() - 1); } } class A { private String name; public A(String name) { this.name = name; } @Override public String toString() { System.out.println("A toString() method called!!"); return this.name; } }
Вывод, полученный приведенной выше программой java array to String, является;
A toString() method called!! A toString() method called!! A toString() method called!! 1,2,3
Поэтому мы рассмотрели, как преобразовать массив строк Java в строку, а затем расширили его для использования с пользовательскими объектами. Это все для преобразования массива java в строку.
Ссылка:
Конвертировать с использованием StringBuffer или StringBuilder
StringBuilder и StringBuffer – это классы, используемые для объединения нескольких значений в одну строку. StringBuffer является потокобезопасным, но медленным, тогда как StringBuilder не является поточно-ориентированным, но работает быстрее.
Пример 1
class Method5 { public static void main(String args[]) { int number1 = -1234; StringBuilder sb = new StringBuilder(); sb.append(number1); String str1 = sb.toString(); System.out.println("With StringBuilder method: string = " + str1); StringBuffer SB = new StringBuffer(); SB.append(number1); String str2 = SB.toString(); System.out.println("With StringBuffer method: string = " + str2); } }
Вывод
With StringBuilder method: string = -1234 With StringBuffer method: string = -1234
Объект StringBuilder представляет объект String, который можно изменять и обрабатывать как массив с последовательностью символов. Чтобы добавить новый аргумент в конец строки, экземпляр StringBuilder реализует метод append().
Пример 2
class Method6 { public static void main(String args[]) { String str1 = new StringBuilder().append(1234).toString(); System.out.println("With StringBuilder method: string = " + str1); String str2 = new StringBuffer().append(1234).toString(); System.out.println("With StringBuffer method: string = " + str2); } }
Вывод
With StringBuilder method: string = -1234 With StringBuffer method: string = -1234
Наиболее важным является вызов метода toString(), чтобы получить строковое представление данных.
6 ответов
Лучший ответ
Поскольку я использовал одно из ваших регулярных выражений, которое вы упомянули в вопросе.
Настройте процессор ReplaceText как
Поиск значения
Восстановительная стоимость
Ввод:
Вывод:
Если вам известна схема данных, вы можете использовать процессор QueryRecord, а затем добавить новое свойство в QueryRecord процессор как
Затем процессор выводит потоковый файл с записями, которые удовлетворяют вышеуказанному SQL-запросу.
Используйте процессор ReplaceText со следующими настройками:
Поиск значения
Восстановительная стоимость
Набор символов
Максимальный размер буфера
Стратегия замены
Режим оценки
Я попытался с приведенными ниже данными в моем локальном экземпляре
содержание входного файла потока
содержимое выходного файла:
Обратитесь к этому ссылка для другого подхода для замены пустых строк в файле потока.
Shu
20 Сен 2018 в 00:25
Вы можете игнорировать эти пустые строки следующим образом.
Использование процессора ReplaceText.
Ссылка: Как использовать регулярные выражения для удаления пробелов между двумя рядами?
Дайте мне знать, если у вас возникнут какие-либо проблемы в этом.
Mahendra Prabhu
20 Сен 2018 в 10:04
Начиная с NiFi 1.7.0 (через NIFI-4456) вы можете настроить JsonTreeReader для чтения «один JSON на строку» в соответствии с вашим форматом. Затем вы можете использовать QueryRecord для выдачи SQL-запроса для маршрутизации записей так, как вам нравится, например, «неверное» свойство с запросом и «допустимое» свойство с запросом или что-то в этом роде.
mattyb
20 Сен 2018 в 15:00
Если все ваши записи будут основаны на строках, это можно решить с помощью Perl. Используя однострочное решение perl, мы можем использовать hex \ x22 для двойных кавычек. Посмотрите, работает ли нижеприведенное для вас. Я добавил пустые строки в дополнение к вашему вводу.
stack0114106
20 Сен 2018 в 10:40
Когда у вас есть (ваш файл преобразован в) файл Unix, вы можете использовать
Walter A
19 Сен 2018 в 21:16
Добавьте это к вашему второму регулярному выражению:
Удалить пустые строки, удалив символы новой строки, которым предшествует другая новая строка.
Andreas Zita
19 Сен 2018 в 20:27
Дополните строку с помощью библиотек
Кроме того, существуют внешние библиотеки, которые уже предлагают функции заполнения.
3.1. Apache Commons Lang
Apache Commons Lang предоставляет пакет служебных классов Java. Одним из самых популярных является StringUtils .
Чтобы использовать его, нам нужно будет включить его в наш проект, добавив к вашему pom.xml файл:
org.apache.commonscommons-lang33.11
А затем мы передаем входную строку и длину , как и созданные нами методы. Мы также можем передать символ заполнения:
assertEquals(" 123456", StringUtils.leftPad("123456", 10)); assertEquals("0000123456", StringUtils.leftPad("123456", 10, "0"));
Опять же, строка | по умолчанию будет заполнена пробелами, или нам нужно явно установить другой символ pad.
Существуют также соответствующие методы right Pad () .
Чтобы узнать больше о функциях Apache Commons Lang3, вы можете ознакомиться с нашим вводным руководством . Если вы хотите увидеть другие способы манипулирования строкой с помощью класса StringUtils , пожалуйста, обратитесь к этой статье .
3.2. Google Guava
Еще одна библиотека, которую мы можем использовать, – это Google Guava . Конечно, сначала нам нужно добавить его в проект, добавив :
com.google.guavaguava27.0-jre
А затем используйте Strings class :
assertEquals(" 123456", Strings.padStart("123456", 10, ' ')); assertEquals("0000123456", Strings.padStart("123456", 10, '0'));
В этом методе нет символа pad по умолчанию, поэтому нам нужно передавать его каждый раз.
Для правой панели мы можем использовать pad И() метод.
Библиотека Гуавы предлагает гораздо больше функций, и мы рассмотрели многие из них. Вы можете посмотреть здесь статьи, связанные с гуавой .
Преобразование строки в логическое или логическое значение
Чтобы преобразовать экземпляр String в примитивный boolean или Boolean тип оболочки, мы можем использовать parseBoolean() или значение() API соответственно:
@Test public void whenConvertedToboolean_thenCorrect() { String beforeConvStr = "true"; boolean afterConvBooleanPrimitive = true; assertEquals(Boolean.parseBoolean(beforeConvStr), afterConvBooleanPrimitive); } @Test public void whenConvertedToBoolean_thenCorrect() { String beforeConvStr = "true"; Boolean afterConvBoolean = true; assertEquals(Boolean.valueOf(beforeConvStr), afterConvBoolean); }
Преобразование строки в дату или LocalDateTime
Java 6 предоставляет java.util.Дата тип данных для представления дат. Java 8 представила новые API для Даты и времени для устранения недостатков более старых java.util.Дата и java.util.Календарь .
8.1. Преобразование строки в java.util.Date
Чтобы преобразовать объекты String в объекты Date , нам нужно сначала построить объект SimpleDateFormat , передав шаблон, описывающий формат даты и времени.
Например, возможное значение для шаблона может быть “ММ-дд-гггг” или “гггг-ММ-дд”. Далее нам нужно вызвать parse метод, передающий Строку .
Строка |, переданная в качестве аргумента, должна быть в том же формате, что и шаблон. В противном случае во время выполнения будет выдано исключение ParseException
@Test public void whenConvertedToDate_thenCorrect() throws ParseException { String beforeConvStr = "15/10/2013"; int afterConvCalendarDay = 15; int afterConvCalendarMonth = 9; int afterConvCalendarYear = 2013; SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy"); Date afterConvDate = formatter.parse(beforeConvStr); Calendar calendar = new GregorianCalendar(); calendar.setTime(afterConvDate); assertEquals(calendar.get(Calendar.DAY_OF_MONTH), afterConvCalendarDay); assertEquals(calendar.get(Calendar.MONTH), afterConvCalendarMonth); assertEquals(calendar.get(Calendar.YEAR), afterConvCalendarYear); }
8.2. Преобразование строки в java.time.LocalDateTime
LocalDateTime -это неизменяемый объект даты и времени, который представляет время, часто рассматриваемое как год-месяц-день-час-минута-секунда.
Чтобы преобразовать строковые объекты в LocalDateTime объекты, мы можем просто использовать parse API:
@Test public void whenConvertedToLocalDateTime_thenCorrect() { String str = "2007-12-03T10:15:30"; int afterConvCalendarDay = 03; Month afterConvCalendarMonth = Month.DECEMBER; int afterConvCalendarYear = 2007; LocalDateTime afterConvDate = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay); assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth); assertEquals(afterConvDate.getYear(), afterConvCalendarYear); }
Строка | должна представлять допустимое время в соответствии с форматом java.time.DateTimeFormatter.ISO_LOCAL_DATE_TIME В противном случае во время выполнения будет выдано исключение ParseException .
Например’ 2011-12-03 ‘ представляет допустимый формат строки, содержащий 4 цифры для года, 2 цифры для месяца в течение года и 2 цифры для дня месяца .
positionCaseInsensitiveUTF8
Такая же, как и , но работает без учета регистра. Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.
Синтаксис
Аргументы
- — строка, по которой выполняется поиск. .
- — подстрока, которую необходимо найти. .
- — опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.
Возвращаемые значения
- Начальная позиция в байтах (начиная с 1), если подстрока найдена.
- 0, если подстрока не найдена.
Тип: .
Пример
Запрос:
Результат: