Преобразование массива строк в строку в java

Преобразование между байтом и шестнадцатеричным

Прежде всего, давайте рассмотрим логику преобразования между байтовыми и шестнадцатеричными числами.

2.1. Байт в шестнадцатеричном формате

Байты-это 8-битные целые числа со знаком в Java. Поэтому нам нужно преобразовать каждый 4-битный сегмент в шестнадцатеричный отдельно и объединить их . Следовательно, после преобразования мы получим два шестнадцатеричных символа.

Например, мы можем записать 45 как 0010 1101 в двоичном формате, а шестнадцатеричный эквивалент будет “2d”:

0010 = 2 (base 10) = 2 (base 16)
1101 = 13 (base 10) = d (base 16)

Therefore: 45 = 0010 1101 = 0x2d

Давайте реализуем эту простую логику в Java:

public String byteToHex(byte num) {
    char[] hexDigits = new char;
    hexDigits = Character.forDigit((num >> 4) & 0xF, 16);
    hexDigits = Character.forDigit((num & 0xF), 16);
    return new String(hexDigits);
}

Теперь давайте разберемся в приведенном выше коде, проанализировав каждую операцию. Прежде всего, мы создали массив символов длиной 2 для хранения выходных данных:

char[] hexDigits = new char;

Затем мы выделили биты более высокого порядка, сдвинув вправо 4 бита. А затем мы применили маску, чтобы изолировать 4 бита более низкого порядка. Маскировка необходима, потому что отрицательные числа внутренне представлены как дополнение двойки к положительному числу:

hexDigits = Character.forDigit((num >> 4) & 0xF, 16);

Затем мы преобразуем оставшиеся 4 бита в шестнадцатеричные:

hexDigits = Character.forDigit((num & 0xF), 16);

Наконец, мы создаем объект String из массива char. А затем вернул этот объект в виде преобразованного шестнадцатеричного массива.

Теперь давайте разберемся, как это будет работать для отрицательного байта -4:

hexDigits:
1111 1100 >> 4 = 1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 1111 & 0xF = 0000 0000 0000 0000 0000 0000 0000 1111 = 0xf

hexDigits:
1111 1100 & 0xF = 0000 1100 = 0xc

Therefore: -4 (base 10) = 1111 1100 (base 2) = fc (base 16)

Также стоит отметить, что символ . forDigit () метод всегда возвращает строчные символы.

2.2. От шестнадцатеричного до байтового

Теперь давайте преобразуем шестнадцатеричную цифру в байт. Как мы знаем, байт содержит 8 бит. Поэтому нам нужны две шестнадцатеричные цифры, чтобы создать один байт .

Прежде всего, мы преобразуем каждую шестнадцатеричную цифру в двоичный эквивалент отдельно.

А затем нам нужно объединить два четырехбитовых сегмента, чтобы получить байтовый эквивалент:

Hexadecimal: 2d
2 = 0010 (base 2)
d = 1101 (base 2)

Therefore: 2d = 0010 1101 (base 2) = 45

Теперь давайте напишем операцию на Java:

public byte hexToByte(String hexString) {
    int firstDigit = toDigit(hexString.charAt(0));
    int secondDigit = toDigit(hexString.charAt(1));
    return (byte) ((firstDigit << 4) + secondDigit);
}

private int toDigit(char hexChar) {
    int digit = Character.digit(hexChar, 16);
    if(digit == -1) {
        throw new IllegalArgumentException(
          "Invalid Hexadecimal Character: "+ hexChar);
    }
    return digit;
}

Давайте разберемся в этом, по одной операции за раз.

Прежде всего, мы преобразовали шестнадцатеричные символы в целые числа:

int firstDigit = toDigit(hexString.charAt(0));
int secondDigit = toDigit(hexString.charAt(1));

Затем мы оставили самую значимую цифру сдвинутой на 4 бита. Следовательно, двоичное представление имеет нули в четырех младших значащих битах.

Затем мы добавили к нему наименее значимую цифру:

return (byte) ((firstDigit << 4) + secondDigit);

Теперь давайте внимательно рассмотрим метод two digit () . Мы используем метод Character.digit() для преобразования. Если значение символа, переданное этому методу, не является допустимой цифрой в указанном радиксе, возвращается значение -1.

Мы проверяем возвращаемое значение и создаем исключение, если было передано недопустимое значение.

Дополните строку с помощью библиотек

Кроме того, существуют внешние библиотеки, которые уже предлагают функции заполнения.

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 И() метод.

Библиотека Гуавы предлагает гораздо больше функций, и мы рассмотрели многие из них. Вы можете посмотреть здесь статьи, связанные с гуавой .

Ниже приведен пример преобразования массива в строку.

 открытый класс ArrayToString { public static void main (String &lsqb;&rsqb; args) {String &lsqb;&rsqb; strArray = new String &lsqb;&rsqb; {"Java", "PHP", ".NET", "PERL", "C", "COBOL"};

Если у вас нет другого выбора, кроме как использовать Java 6 или 7, вам следует использовать соединение Divide & Conquer.

Используйте метод соединения библиотеки StringUtils Apache Commons.

Вам нужен код, который создает строку из arrayList,

вы можете сделать это двумя способами: используя String как результат или StringBuffer / StringBuilder.

Пример:

… но это не очень хорошая практика по причинам производительности. Лучше использовать StringBuffer (потокобезопасный) или StringBuilder, которые более подходят для добавления строк

1 Ваш ответ в основном такой же, как smas; просто немного сложнее; таким образом, конечно, не «самый простой». К тому же Arrays.toString () еще проще.

Если вы знаете, сколько элементов в массиве, это можно сделать простым способом:

  • 10 Это вряд ли применимо в реальном мире и показывает некоторые плохие практики программирования.
  • 3 Может быть отличной золотой медалью за достижение -50 негативов

Использование класса BigInteger

Мы можем создать объект типа BigInteger , передав сигнум и массив байтов .

Теперь мы можем сгенерировать шестнадцатеричный String с помощью статического формата метода, определенного в классе String :

public String encodeUsingBigIntegerStringFormat(byte[] bytes) {
    BigInteger bigInteger = new BigInteger(1, bytes);
    return String.format(
      "%0" + (bytes.length << 1) + "x", bigInteger);
}

Предоставленный формат будет генерировать шестнадцатеричную строку с нулевым заполнением в нижнем регистре . Мы также можем сгенерировать строку в верхнем регистре, заменив “x” на “X”.

В качестве альтернативы мы могли бы использовать метод toString() из BigInteger . Тонкое отличие использования метода toString() заключается в том, что выходные данные не заполняются начальными нулями :

public String encodeUsingBigIntegerToString(byte[] bytes) {
    BigInteger bigInteger = new BigInteger(1, bytes);
    return bigInteger.toString(16);
}

Теперь давайте посмотрим на шестнадцатеричное преобразование String в byte Array:

public byte[] decodeUsingBigInteger(String hexString) {
    byte[] byteArray = new BigInteger(hexString, 16)
      .toByteArray();
    if (byteArray == 0) {
        byte[] output = new byte;
        System.arraycopy(
          byteArray, 1, output, 
          0, output.length);
        return output;
    }
    return byteArray;
}

Метод toByteArray() создает дополнительный знаковый бит . Мы написали специальный код для обработки этого дополнительного бита.

Следовательно, мы должны знать об этих деталях, прежде чем использовать класс BigInteger для преобразования.

Создание

Массивы являются базовой возможностью Powershell, и их создание делается просто. Для создания нужно использовать символы @() :

Count (в переводе счетчик) — показывает сколько у нас элементов в массиве. Так как мы создали пустое множество он равен нулю.

Можно создать сразу со значениями. Что бы это выполнить нужно добавить значения, разделенные запятой, внутри @() :

Написав $array мы вывели значения переменной. Каждое из четырех значений выводится с новой строчки. 

Другой способ создания — это писать значения с новой строчки. В этом случае запятые ставить не обязательно:

 Хоть такая возможность и есть в Powershell, я бы не советовал использовать без запятых. В остальном, с использованием табуляции, такой синтаксис может улучшить читаемость (особенно если у нас сотни значений).

Еще один способ объявления — это не указывать скобки и знак @ :

Следующий вариант не используется на практике, но вы можете иметь его ввиду:

Обратите внимание, что число 4 стало строкой только тогда, когда ее поместили в кавычки

Сортировка объектов

Показанный ранее пример Arrays.sort() работает только для массивов примитивных типов данных, которые имеют порядок:

  • естественный;
  • числовой;
  • символьный в таблице ASCII (двоичное число, представляющее символ).

У объектов может не быть естественного порядка сортировки, поэтому вам нужно предоставить другой объект, который может определять порядок ваших объектов. Такой объект называется компаратором – это интерфейс.

Вот первый класс для объектов, которые мы хотим отсортировать:

private static class Employee{
    public String name;
    public int    employeeId;

    public Employee(String name, int employeeId){
        this.name       = name;
        this.employeeId = employeeId;
    }
}

Класс Employee – это простая модель сотрудника, у которого есть имя и идентификатор. Вы можете отсортировать массив объектов Employee по имени или по идентификатору сотрудника.

Вот первый пример сортировки массива объектов Employee по их имени с помощью метода Arrays.sort():

Employee[] employeeArray = new Employee;

employeeArray = new Employee("Xander", 1);
employeeArray = new Employee("John"  , 3);
employeeArray = new Employee("Anna"  , 2);

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.name.compareTo(e2.name);
    }
});


for(int i=0; i < employeeArray.length; i++) {
    System.out.println(employeeArray.name);
}
  1. Сначала объявляется массив.
  2. Три объекта Employee создаются и вставляются в массив.
  3. Метод Arrays.sort() вызывается для сортировки массива. В качестве параметра передаем массив employee и реализацию Comparator, которая может определять порядок объектов Employee. Это создает анонимную реализацию интерфейса Comparator.

В примере важно уловить реализацию метода compare() анонимной внутренней реализации интерфейса Comparator. Этот метод возвращает:

  • положительное число, если первый объект «больше»(позже в порядке сортировки), чем второй объект;
  • 0 – они «равны»(в порядке сортировки);
  • отрицательное число, если первый объект «меньше» (ранее в порядке сортировки), чем второй объект.

В приведенном выше примере мы просто вызываем метод String.compare(), который выполняет для нас сравнение (сравнивает имена сотрудников).

После сортировки массива мы перебираем его и выводим имена сотрудников. Вывод:

Anna
John
Xander

Обратите внимание, как порядок был изменен по сравнению с порядком, в котором они были первоначально вставлены в массив. Сортировка объектов Employee по их идентификатору сотрудника на основании предыдущего примера с измененной реализацией метода compare() анонимной реализации интерфейса Comparator:

Сортировка объектов Employee по их идентификатору сотрудника на основании предыдущего примера с измененной реализацией метода compare() анонимной реализации интерфейса Comparator:

Employee[] employeeArray = new Employee;

employeeArray = new Employee("Xander", 1);
employeeArray = new Employee("John"  , 3);
employeeArray = new Employee("Anna"  , 2);

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.employeeId - e2.employeeId;
    }
});

for(int i=0; i < employeeArray.length; i++) {
    System.out.println(employeeArray.name);
}

Вывод:

Xander
Anna
John

Чтобы сравнить объекты Employee в массиве сначала по их имени, а если оно совпадает, то по их идентификатору сотрудника, реализация compare():

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        int nameDiff = e1.name.compareTo(e2.name);
        if(nameDiff != 0) { return nameDiff; }
    
        return e1.employeeId - e2.employeeId;
    }
});

Использование стрингутилов

Библиотеки Apache Commons добавляют некоторые полезные методы для управления основными типами Java. Apache Commons Lang предоставляет множество вспомогательных утилит для API java.lang, в первую очередь String методы манипулирования.

В этом примере мы увидим как извлечь подстроку, вложенную между двумя строками

assertEquals("United States of America", 
  StringUtils.substringBetween(text, "(", ")"));

Существует упрощенная версия этого метода в случае, если подстрока вложена между двумя экземплярами одной и той же строки

substringBetween(String str, String tag)

Метод substringAfter из того же класса получает подстроку после первого вхождения разделителя.

Разделитель не возвращается:

assertEquals("the USA (United States of America).", 
  StringUtils.substringAfter(text, "living in "));

Аналогично, метод substringBefore получает подстроку перед первым вхождением разделителя.

Разделитель не возвращается:

assertEquals("Julia Evans", 
  StringUtils.substringBefore(text, " was born"));

Вы можете ознакомиться с этим руководством, чтобы узнать больше об обработке String с помощью API Apache Commons Lang.

Типы массивов

По умолчанию массив в Powershell создается типа ]. Это позволяет хранить любые типы данных. Если вы хотите хранить строгие типы данных, например только числа или определенный набор, то вы можете использовать следующие методы:

Массив из определенных типов данных

Используя следующий методы можно создать любой массив со строгими типами данных. Пример ниже позволяет использовать только числа:

Обратите внимание, что 4 объявлена строковой, но она сама преобразуется в число без ошибок. В случае добавления букв будет ошибка:

  • Не удается преобразовать значение «s» в тип «System.Int32». Ошибка: «Входная строка имела неверный формат.»
  • Cannot convert value «s» to type «System.Int32». Error: «Input string was not in a correct format.»

Так же можно сделать и со строками, но в таком случае все добавленные данные преобразуются в строки:

Универсальные списки

Универсальные списки относятся к C#, в котором нужно определять типы данных. Так мы создадим список из строк:

А так будет создан список из целых чисел:

Начиная с версии Powershell 5 можно сократить синтаксис используя using namespace. Using указывается в самом начале скрипта. 

Следующий синтаксис добавит число в список:

Значения так же можно получать по индексам:

Для удаления используется следующий синтаксис:

Можно так же удалять по индексам:

Список из любого типа данных можно создать и так:

ArrayList

Для поддержки удаления, которого нет в обычных массивах, можно использовать ArrayList. Они так же быстрее работают. Для создания такого массива используйте следующий синтаксис:

Для удаления:

Apache Commons Lang

В этом решении мы будем использовать библиотеку Apache Commons Lang3 для выполнения наших преобразований. Apache Commons Lang3 предоставляет несколько вспомогательных функций для управления основными классами Java.

Сначала мы разделим нашу строку на массив строк с помощью StringUtils.splitPreserveAllTokens . Затем мы преобразуем наш новый строковый массив в список, используя метод Arrays.asList :

List convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));

Теперь давайте преобразуем нашу строку чисел в список целых чисел.

Мы снова будем использовать метод StringUtils.split для создания массива строк из нашей строки. Затем мы преобразуем каждую строку в нашем новом массиве в целое число с помощью Integer.parseInt и добавим преобразованное целое число в наш список:

String[] convertedRankArray = StringUtils.split(ranks, ",");
List convertedRankList = new ArrayList();
for (String number : convertedRankArray) {
    convertedRankList.add(Integer.parseInt(number.trim()));
}

В этом примере мы использовали метод splitPreserveAllTokens для разделения нашей строки стран , в то время как мы использовали метод split для разделения нашей строки рангов .

Несмотря на то, что обе эти функции разбивают строку на массив, splitPreserveAllTokens сохраняет все токены, включая пустые строки, созданные соседними разделителями, в то время как метод split игнорирует пустые строки .

Итак, если у нас есть пустые строки, которые мы хотим включить в наш список, то мы должны использовать splitPreserveAllTokens вместо split .

15 ответов

чтобы начать вас на вашем назначении, String.split разбивает строки на регулярное выражение, это выражение может быть пустой строкой:

избавление от пустой 1-й записи остается в качестве упражнения для читателя: -)

Примечание: в Java 8, пустой первый элемент больше не включается.

вторая строка выделяет строковый массив длиной 1

Обратите внимание, что вам не нужно указывать длину самостоятельно, например:. вместо этого длина определяется количеством элементов в инициализаторе

Используя

вместо этого длина определяется количеством элементов в инициализаторе. Используя

создает массив длиной 3.

предполагая, что вам действительно нужен массив односимвольных строк (а не char[] или Character[] )

1. Использование регулярного выражения:

нулевая ширина отрицательного lookahead предотвращает соответствие шаблона в начале ввода, так что вы не получите ведущую пустую строку.

Я думаю, что в этом просто нет необходимости, так как это не будет проще, чем

конечно, если вы настаиваете, вы можете написать:

Если вы хотите однобуквенные строки, вы можете использовать:

к сожалению, s будет пустым, но после этого последуют буквы n,a,m,e. Если это проблема, вы можете использовать, например, System.arrayCopy, чтобы избавиться от первой записи массива.

в java 8 есть метод, с помощью которого вы можете сделать это: toCharArray ():

это приводит к следующему спектру:

string array = массив символов ?

или у вас есть строка с несколькими словами, каждый из которых должен быть элементом массива ?

String[] array = yourString.split(wordSeparator);

преобразовать его в тип Char ?

просто использовать .метод tocharArray () в java

Это должно работать просто отлично в JAVA 8

как уже упоминалось, вы можете легко преобразовать исходную строку «name» в массив символов:

чтобы продолжить этот ход мыслей, вы можете преобразовать массив символов в массив строк:

в этот момент ваш stringArray будет заполнен исходными значениями из вашей исходной строки «name». Например, теперь вызываем

вернет значение » n » (в виде строки) в этот случай.

разделять пустой строкой строку.split () возвращает массив одиночных элементов, содержащий пустую строку. В большинстве случаев вы, вероятно, предпочтете получить пустой массив или null, если вы передали null, что именно то, что вы получаете с org.апаш.палата общин.lang3.StringUtils.split (str).

другой вариант-google guava сплиттер.split () и сплиттер.splitToList () что вернуть итератор и список соответственно. В отличие от версии Apache Splitter будет бросать NPE на null :

Если вам нужен список, а не итератор, используйте сплиттер.splitToList ().

метод String.split будет генерировать пустой 1-й, вы должны удалить его из массива. Это скучно.

вы могли бы использовать string.chars().mapToObj(e -> new String(new char[] )); , хотя это довольно долго и работает только с java 8. Вот еще несколько методов:

string.split(«»); (Has an extra whitespace character at the beginning of the array if used before Java 8) string.split(«|»); string.split(«(?!^)»); Arrays.toString(string.toCharArray()).substring(1, string.length() * 3 + 1).split(«, «);

последний просто излишне долго, это просто для удовольствия!

основываясь на названии этого вопроса, я пришел сюда, чтобы преобразовать строку в массив подстрок, разделенных некоторым разделителем. Я добавлю этот ответ здесь для других, у кого может быть тот же вопрос.

это делает массив слов, разделяя строку на каждое помещение:

это создает следующий массив:

протестировано в Java 8

здесь есть преобразование простой строки в строковый массив с помощью метода split.

Я хочу создать массив String, содержащий несколько пустых строк.

В python мы могли бы достичь этого просто с помощью этого кода * 5 Есть ли что-то подобное для java?

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: