Содержание

java объединить два массива — ComputerMaker.info

Автор admin На чтение 8 мин. Просмотров 250 Опубликовано

Мне нужно соединить два String массивы в Java.

Какой самый простой способ сделать это?

58 ответов

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

Я нашел однострочное решение из старой доброй библиотеки Apache Commons Lang.
ArrayUtils.addAll(T[], T. )

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

Обратите внимание, что он не будет работать с примитивными типами данных, только с типами объектов.

Следующая немного более сложная версия работает как с объектными, так и с примитивными массивами. Это делается с помощью T вместо T[] в качестве типа аргумента.

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

Можно написать полностью общую версию, которая может быть расширена для объединения любого числа массивов. Эти версии требуют Java 6, так как они используют Arrays.copyOf()

Обе версии избегают создания какого-либо посредника List объекты и использование System.arraycopy() обеспечить максимально быстрое копирование больших массивов.

Для двух массивов это выглядит так:

А для произвольного числа массивов (> = 1) это выглядит так:

С помощью Stream в Java 8:

Также есть версии для примитивных массивов:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)

Использование Java API:

Вы можете добавить два массива в две строки кода.

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

Вам следует избегать решений, включающих ArrayLists, потоки и т.д., Так как они должны будут выделять временную память без какой-либо полезной цели.

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

Решение 100% старой Java и без System.arraycopy (например, недоступно в GWT-клиенте):

Я недавно боролся с проблемами с чрезмерным вращением памяти. Если известно, что a и/или b обычно пустые, вот еще одна адаптация кода silvertab (также обобщенная):

Редактировать: в предыдущей версии этого поста говорилось, что повторное использование массива должно быть четко задокументировано. Как указывает Мартен в комментариях, в целом было бы лучше просто удалить операторы if, что исключает необходимость иметь документацию. Но опять же, эти операторы if были главной целью этой конкретной оптимизации. Я оставлю этот ответ здесь, но будьте осторожны!

Функциональная Java в библиотеке есть класс-оболочка для массива, который оснащает массивы такими удобными методами, как конкатенация.

Мне нужно объединить два String массива в Java.

Какой самый простой способ сделать это?

Я нашел однострочное решение из старой доброй библиотеки Apache Commons Lang.
ArrayUtils.addAll(T[], T. )

Если вы хотите работать с ArrayLists в решении, вы можете попробовать это:

Еще один, основанный на предложении SilverTab, но созданный для поддержки x количества аргументов и не требующий Java 6. Он также не является универсальным, но я уверен, что его можно сделать универсальным.

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

Этот работает без знания каких-либо других классов / библиотек и т. Д. Он работает для любого типа данных. Просто замените String на что-нибудь вроде int , double или char . Это работает довольно эффективно.

Решение не на Java 8:

Вы можете попробовать это

U можете набрать свой массив .

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

Если вы хотите объединить String

Пример кода для объединения двух строковых массивов

Если вы хотите объединить Int

Пример кода для конкатенации двух целочисленных массивов

Вот метод Main

Мы также можем использовать этот способ.

Также есть версии для примитивных массивов:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)

Вы можете добавить два массива в две строки кода.

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

Вам следует избегать решений, включающих ArrayLists, потоки и т. Д., Так как они должны будут выделять временную память без какой-либо полезной цели.

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

Я недавно боролся с проблемами с чрезмерным вращением памяти. Если известно, что a и / или b обычно пусты, вот еще одна адаптация кода silvertab (также обобщенного):

Редактирование: в предыдущей версии этого поста говорилось, что повторное использование массива выглядит следующим образом должны быть четко документированы. Как указывает Мартен в комментариях, в целом было бы лучше просто удалить операторы if, что исключает необходимость иметь документацию. Но опять же, эти операторы if были главной целью этой конкретной оптимизации. Я оставлю этот ответ здесь, но будьте осторожны!

Библиотека Functional Java имеет класс-обертку для массива, который оснащает массивы такими удобными методами, как конкатенация.

Тип примитива предопределен языком Java и называется зарезервированным ключевым словом. Примитивные значения не разделяют состояние с другими примитивными значениями. Восемь примитивных типов данных, поддерживаемых языком программирования Java :

  • байт : byte тип данных – это 8-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -128 и максимальное значение 127 (включительно). byte Тип данных может быть полезен для сохранения памяти в больших массивах, где экономия памяти действительно имеет значение. Они также могут быть использованы вместо int где их пределы помогают уточнить ваш код; тот факт, что диапазон переменной ограничен, может служить формой документации.
  • Короче говоря : short тип данных – это 16-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -32 768 и максимальное значение 32 767 (включительно). Как с byte применяются те же правила: вы можете использовать short экономить память в больших массивах в ситуациях, когда экономия памяти действительно имеет значение.
  • int : int тип данных – это 32-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно). Для целочисленных значений этот тип данных обычно является выбором по умолчанию, если только нет причины (как указано выше) выбрать что-то еще. Этот тип данных, скорее всего, будет достаточно большим для чисел, которые будет использовать ваша программа, но если вам нужен более широкий диапазон значений, используйте long вместо.
  • долго : long тип данных – это 64-разрядное целое число со знаком в виде двоичного числа со знаком. Он имеет минимальное значение -9,223,372,036,854,775,808 и максимальное значение 9,223,372,036,854,775,807 (включительно). Используйте этот тип данных, когда вам нужен диапазон значений, более широкий, чем те, которые предоставляются int ,
  • плавать : float тип данных – 32-битная IEEE 754 с плавающей запятой одинарной точности. Его диапазон значений выходит за рамки этого обсуждения, но указан в разделе «Типы, форматы и значения с плавающей запятой» в спецификации языка Java. Как и с рекомендациями для byte а также short , использовать float (вместо double ) если вам нужно сохранить память в больших массивах чисел с плавающей запятой. Этот тип данных никогда не должен использоваться для точных значений, таких как валюта. Для этого вам нужно будет использовать класс java.math.BigDecimal. Числа и Строки покрывают BigDecimal и другие полезные классы, предоставляемые платформой Java.
  • двойной : double тип данных – 64-битная IEEE 754 с плавающей запятой двойной точности. Его диапазон значений выходит за рамки этого обсуждения, но указан в разделе «Типы, форматы и значения с плавающей запятой» в спецификации языка Java. Для десятичных значений этот тип данных обычно является выбором по умолчанию. Как упоминалось выше, этот тип данных никогда не должен использоваться для точных значений, таких как валюта.
  • логическое : boolean Тип данных имеет только два возможных значения: true а также false , Используйте этот тип данных для простых флагов, которые отслеживают истинные / ложные условия. Этот тип данных представляет один бит информации, но его «размер» не является чем-то точно определенным.
  • символ : char тип данных – это один 16-битный символ Unicode. Имеет минимальное значение ‘u0000’ (или 0) и максимальное значение ‘uffff’ (или 65 535 включительно).

Ниже Java Code показывает, как сделать объединение в Java без использования Java Collection >

Как объединить два массива в один java

Как я могу объединить два массива в Java?

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

Обратите внимание, что он не будет работать с примитивными типами данных, только с типами объектов.

Следующая несколько более сложная версия работает как с объектными, так и с примитивными массивами. Он делает это, используя T вместо T[] в качестве типа аргумента.

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

Ответ 3

Можно написать полностью общую версию, которая может быть даже расширена, чтобы объединить любое количество массивов. Для этих версий требуется Java 6, поскольку они используют Arrays.copyOf()

Обе версии избегают создания каких-либо промежуточных объектов List и используют System.arraycopy() , чтобы обеспечить максимально быстрое копирование больших массивов.

Для двух массивов это выглядит так:

А для произвольного количества массивов ( >= 1) это выглядит так:

Ответ 4

Использование Stream в Java 8:

Ответ 5

Кроме того, существуют версии для примитивных массивов:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts. concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)
Ответ 6

Использование Java API:

Ответ 7

Вы можете добавить два массива в две строки кода.

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

Вам следует избегать решений, включающих ArrayLists, потоки и т.д., Так как они должны будут выделять временную память без какой-либо полезной цели.

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

Ответ 8

Решение 100% старой java и без System.arraycopy (например, недоступно в клиенте GWT):

Ответ 9

Я недавно боролся с проблемами с чрезмерным вращением памяти. Если известно, что a и/или b обычно пусты, вот еще одна адаптация кода silvertab (также генерируется):

Редактировать: в предыдущей версии этого поста говорилось, что повторное использование массива должно быть четко задокументировано. Как указывает Мартен в комментариях, в целом было бы лучше просто удалить операторы if, что исключает необходимость иметь документацию. Но опять же, эти операторы if были главной целью этой конкретной оптимизации. Я оставлю этот ответ здесь, но будьте осторожны!

Ответ 10

Функциональная библиотека Java имеет класс оболочки-массива, который оснащает массивы удобными методами, такими как конкатенация.

Чтобы вернуть освобожденный массив, вызовите

Ответ 11
Ответ 12

Здесь адаптация решения silvertab с модифицированными дженериками:

ПРИМЕЧАНИЕ. См. Ответ Joachim для решения Java 6. Это не только устраняет предупреждение; он также короче, эффективнее и легче читать!

Ответ 13

Другой способ использования Java8 с помощью Stream

Ответ 14

Если вы используете этот способ, вам не нужно импортировать какой-либо сторонний класс.

Если вы хотите объединить String

Пример кода для concate двух String Array

Если вы хотите объединить Int

Пример кода для concate двух целых массивов

Вот основной метод

Мы также можем использовать этот способ.

Ответ 15

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

Ответ 16

Вы можете попробовать преобразовать его в Arraylist и использовать метод addAll, а затем преобразовать обратно в массив.

Ответ 17

Здесь возможная реализация в рабочем коде решения псевдокода, написанного silvertab.

Далее следуют интерфейс построителя.

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

из-за стирания родового типа:

Здесь конкретный строитель, реализующий интерфейс, построив массив Integer :

И, наконец, приложение /test:

Ответ 18

Используя потоки Java 8+, вы можете написать следующую функцию:

Ответ 19

Это работает, но вам нужно вставить свою собственную проверку ошибок.

Он, вероятно, не самый эффективный, но он не полагается ни на что иное, кроме Java собственного API.

Ответ 20

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

Ответ 21

Это преобразованная функция для массива String:

Ответ 22

Как насчет просто

И просто сделайте Array.concat(arr1, arr2) . Пока arr1 и arr2 имеют один и тот же тип, это даст вам другой массив того же типа, содержащий оба массива.

Ответ 23

Это должно быть однострочным.

Ответ 24

Простая вариация, позволяющая объединить несколько массивов:

Ответ 25

Вот моя немного улучшенная версия Joachim Sauer concatAll. Он может работать на Java 5 или 6, используя Java 6 System.arraycopy, если он доступен во время выполнения. Этот метод (IMHO) идеально подходит для Android, поскольку он работает на Android < 9 (который не имеет System.arraycopy), но будет использовать более быстрый метод, если это возможно.

Ответ 26

Еще один способ задуматься над вопросом. Чтобы объединить два или более массивов, нужно сделать это, чтобы перечислить все элементы каждого массива, а затем построить новый массив. Это похоже на создание List<T> , а затем называет toArray . В некоторых других ответах используется ArrayList , и это прекрасно. Но как насчет внедрения наших собственных? Это не сложно:

Я считаю, что приведенное выше эквивалентно решениям, использующим System.arraycopy . Однако я думаю, что у этого есть своя красота.

Ответ 27
Ответ 28

Использование только собственного API Javas:

Теперь этот код не самый эффективный, но он опирается только на стандартные классы Java и легко понять. Он работает для любого числа String [] (даже нулевые массивы).

Ответ 29

Простой, но неэффективный способ сделать это (generics не включены):

Ответ 30

Независимость от типа (ОБНОВЛЕНО — благодаря Volley для создания экземпляра T):

Варианты объединения двух массивов в Java

В любом языке с долгой историей появляется то-ли фича то ли бага делать одну, вроде бы простую вещь можно несколькими способами. Возьмем тривиальную задачу: объединить два массива одного типа в один в java. И тут оказывается есть три способа как это сделать с разной степенью абстракции и со своими плюсами и минусами. Рассмотрим их.

Первый и самый короткий — это использовать старую добрую библиотечку Apache Commons Lang. И метод public static T[] addAll(T[] array1,T… array2).
Пример использования:

How can I concatenate two arrays in Java?

Here’s a simple method that will concatenate two arrays and return the result:

Note that it will not work with primitive data types, only with object types.

The following slightly more complicated version works with both object and primitive arrays. It does this by using T instead of T[] as the argument type.

It also makes it possible to concatenate arrays of two different types by picking the most general type as the component type of the result.

Here is an example:

Using Stream in Java 8:

Or like this, using flatMap :

To do this for a generic type you have to use reflection:

It’s possible to write a fully generic version that can even be extended to concatenate any number of arrays. This versions require Java 6, as they use Arrays.copyOf()

Both versions avoid creating any intermediary List objects and use System.arraycopy() to ensure that copying large arrays is as fast as possible.

For two arrays it looks like this:

And for a arbitrary number of arrays (>= 1) it looks like this:

Or with the beloved Guava:

Also, there are versions for primitive arrays:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)

You can append the two arrays in two lines of code.

This is a fast and efficient solution and will work for primitive types as well as the two methods involved are overloaded.

You should avoid solutions involving ArrayLists, streams, etc as these will need to allocate temporary memory for no useful purpose.

You should avoid for loops for large arrays as these are not efficient. The built in methods use block-copy functions that are extremely fast.

Using the Java API:

A solution 100% old java and without System.arraycopy (not available in GWT client for example):

I’ve recently fought problems with excessive memory rotation. If a and/or b are known to be commonly empty, here is another adaption of silvertab’s code (generified too):

Edit: A previous version of this post stated that array re-usage like this shall be clearly documented. As Maarten points out in the comments it would in general be better to just remove the if statements, thus voiding the need for having documentation. But then again, those if statements were the whole point of this particular optimization in the first place. I’ll leave this answer here, but be wary!

The Functional Java library has an array wrapper class that equips arrays with handy methods like concatenation.

Как соединить 2 массива java

Как я могу объединить два массива в Java?

Это не отвечает на ваш вопрос напрямую, но я хотел бросить пару вещей:

Обычно я считаю контрпродуктивным отдельный сгенерированный код. Мне всегда нравится, как правило, следовать правилу «один класс за файл», но здесь я делаю исключение, потому что часто имею дело с очень большими схемами. Даже в своем собственном каталоге, я не хочу, чтобы разделить десятки (до сотен) файлов, когда я создаю новую версию кода. Мне очень удобно иметь весь сгенерированный код, который может быть размытым в одном файле.

Теперь, чтобы предложить возможное решение — Resharper имеет возможность вытащить все классы из файл и поместить их в свои собственные файлы. Если вы щелкните правой кнопкой мыши файл в проводнике решений, вы можете сказать Refactor → Переместить типы в соответствующие файлы . . Конечно, это не так удобно, как просто генерировать его таким образом, но я не знаю инструмента, который это сделает.

41 ответ

Я нашел однострочное решение из старой доброй библиотеки Apache Commons Lang.
ArrayUtils.addAll(T[], T. )

Если вы хотите работать с ArrayLists в решении, вы можете попробовать это:

Как я могу объединить два массива в Java?

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

Обратите внимание, что он не будет работать с примитивными типами данных, только с типами объектов.

Следующая несколько более сложная версия работает как с объектными, так и с примитивными массивами. Он делает это, используя T вместо T[] в качестве типа аргумента.

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

Можно написать полностью общую версию, которая может быть даже расширена, чтобы объединить любое количество массивов. Для этих версий требуется Java 6, поскольку они используют Arrays.copyOf()

Обе версии избегают создания каких-либо промежуточных объектов List и используют System. arraycopy() , чтобы обеспечить максимально быстрое копирование больших массивов.

Для двух массивов это выглядит так:

А для произвольного количества массивов ( >= 1) это выглядит так:

Однострочный в Java 8:

Кроме того, существуют версии для примитивных массивов:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)

Использование Java API:

Решение 100% старой java и без System.arraycopy (например, недоступно в клиенте GWT):

Вы можете добавить два массива в две строки кода.

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

Вам следует избегать решений, включающих ArrayLists, потоки и т. д., Так как они должны будут выделять временную память без какой-либо полезной цели.

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

Недавно я столкнулся с проблемами с чрезмерным вращением памяти. Если a и/или b, как известно, обычно пусты, вот еще одна адаптация кода silvertab (также генерируется):

(В любом случае поведение повторного использования массива должно быть явно JavaDoced!)

Функциональная библиотека Java имеет класс оболочки-массива, который оснащает массивы удобными методами, такими как конкатенация.

Чтобы вернуть освобожденный массив, вызовите

Здесь адаптация решения silvertab с модифицированными дженериками:

ПРИМЕЧАНИЕ. См. Ответ Joachim для решения Java 6. Это не только устраняет предупреждение; он также короче, эффективнее и легче читать!

Другой способ использования Java8 с помощью Stream

Если вы используете этот способ, вам не нужно импортировать какой-либо сторонний класс.

Если вы хотите объединить String

Пример кода для concate двух String Array

Если вы хотите объединить Int

Пример кода для concate двух целых массивов

Вот основной метод

Мы также можем использовать этот способ.

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

Вы можете попробовать преобразовать его в Arraylist и использовать метод addAll, а затем преобразовать обратно в массив.

Здесь возможная реализация в рабочем коде решения псевдокода, написанного silvertab.

Далее следуют интерфейс построителя.

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

из-за стирания родового типа:

Здесь конкретный строитель, реализующий интерфейс, построив массив Integer :

И, наконец, приложение /test:

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

Это работает, но вам нужно вставить свою собственную проверку ошибок.

Он, вероятно, не самый эффективный, но он не полагается ни на что иное, кроме Java собственного API.

Как насчет просто

И просто сделайте Array.concat(arr1, arr2) . Пока arr1 и arr2 имеют один и тот же тип, это даст вам другой массив того же типа, содержащий оба массива.

Это преобразованная функция для массива String:

Еще один способ задуматься над вопросом. Чтобы объединить два или более массивов, нужно сделать это, чтобы перечислить все элементы каждого массива, а затем построить новый массив. Это похоже на создание List<T> , а затем называет toArray . В некоторых других ответах используется ArrayList , и это прекрасно. Но как насчет внедрения наших собственных? Это не сложно:

Я считаю, что приведенное выше эквивалентно решениям, использующим System.arraycopy . Однако я думаю, что у этого есть своя красота.

Вот моя немного улучшенная версия Joachim Sauer concatAll. Он может работать на Java 5 или 6, используя Java 6 System.arraycopy, если он доступен во время выполнения. Этот метод (IMHO) идеально подходит для Android, поскольку он работает на Android < 9 (который не имеет System.arraycopy), но будет использовать более быстрый метод, если это возможно.

Простая вариация, позволяющая объединить несколько массивов:

Независимость от типа (ОБНОВЛЕНО — благодаря Volley для создания экземпляра T):

Простой, но неэффективный способ сделать это (generics не включены):

Использование только собственного API Javas:

Теперь этот код не самый эффективный, но он опирается только на стандартные классы Java и легко понять. Он работает для любого числа String [] (даже нулевые массивы).

Общая статическая версия, в которой используется высокопроизводительная System.arraycopy, не требующая аннотации @SuppressWarnings:

Это должно быть однострочным.

Используя потоки Java 8+, вы можете написать следующую функцию:

Каждый ответ — копирование данных и создание нового массива. Это не является строго необходимым и определенно НЕ является тем, что вы хотите сделать, если ваши массивы достаточно велики. Создатели Java уже знали, что массивные копии являются расточительными, и именно поэтому они предоставили нам System.arrayCopy() для выполнения этих внешних Java, когда мы должны.

Вместо того, чтобы копировать свои данные, подумайте о том, чтобы оставить его на месте и извлечь из него, где он лежит. Копирование местоположений данных только потому, что программист хотел бы их организовать, не всегда разумно.

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

Вы можете заменить String типом/классом по своему вкусу

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

Если вы хотите работать с ArrayLists в решении, вы можете попробовать следующее:

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

Я думаю, что лучшим решением с дженериками будет:

Вы можете попробовать это

U может набирать ваш массив.

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

Еще один, основанный на предположении SilverTab, но сделан для поддержки x аргументов и не требует Java 6. Он также не является общим, но я уверен, что он может быть общим.

Вероятно, это единственный общий и безопасный для типов способ:

И использование довольно кратко:

(требуется статический импорт)

Неверные типы массивов отклоняются:

Вы можете использовать коллекцию ArrayList для этого. его реализация очень проста для понимания, сначала вы должны хранить оба массива String, которые представлены в аргументах в ArrayList, а после этого просто конвертировать этот ArrayList в массив String с помощью метода toArray(), вот реализация:

Решение Non Java 8:

Еще один ответ для любителей алгоритмов:

Это работает без знания каких-либо других классов/библиотек и т.д. Он работает для любого типа данных. Просто замените String на что-нибудь вроде int , double или char . Он работает достаточно эффективно.

Это работает только с int, но идея является общей

Должен сделать трюк. Сначала предполагается, что String [] и String [] second

Посмотрите на это элегантное решение (если вам нужен другой тип, чем char, измените его):

Вы можете объединить каждое количество массивов.

В Haskell вы можете сделать что-то вроде [a, b, c] ++ [d, e] , чтобы получить [a, b, c, d, e] . Это списки Haskell, объединенные, но было бы очень приятно видеть аналогичный оператор в Java для массивов. Разве вы так не думаете? Это элегантное, простое, универсальное и это не так сложно реализовать.

Если вы хотите, я предлагаю вам взглянуть на работу Александра Христова в его Взлом компилятора OpenJDK. Он объясняет, как изменить источник javac для создания нового оператора. Его пример состоит в определении оператора «**», где i ** j = Math.pow(i, j) . Можно взять этот пример для реализации оператора, который объединяет два массива того же типа.

Как только вы это сделаете, вы привязаны к своему настроенному javac для компиляции вашего кода, но сгенерированный байт-код будет понят любой JVM.

Конечно, вы можете реализовать свой собственный метод конкатенации массива на вашем исходном уровне, есть много примеров того, как это сделать в других ответах!

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

Объединить два отсортированных массива в java

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

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

Вот мой вопрос:

Реализуйте метод слияния, который, учитывая два массива отсортированных целочисленных элементов, возвращает новый отсортированный массив со всеми элементами двух входных массивов.

Предположим, что элементы в обоих входных массивах отсортированы в неубывающем порядке (например, [0, 1, 2, 2] и [1, 2, 3, 3, 4, 5]). Возвращенный «объединенный» массив должен сохранять это свойство (например, [0, 1, 1, 2, 2, 2, 3, 3, 4, 5]).

Дубликаты разрешены как на входе, так и на выходе.

Если один из массивов имеет значение NULL, вернуть ненулевой массив как копию, если оба массива равны NULL, результат также должен быть NULL.

Требование эффективности: массивы должны быть объединены за один проход по массивам.

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

Схема PDL

Содержание

  • Определение схемы PDL
  • Создание схемы
  • Тип записи
  • Примитивные типы
  • Тип перечисления
  • Тип массива
  • Тип карты
  • Тип соединения
  • Типовой номер
  • Фиксированный тип
  • Импорт
  • Свойства
  • Пакет
  • Побег

Определение схемы PDL

Pegasus — это система определения и сериализации схемы, разработанная как часть Фреймворк Rest. li. Он обеспечивает многоязычность поддерживать для сервисов, созданных с использованием Rest.li, и обрабатывает кажущуюся сериализацию и десериализация данных между сервером и клиентами.

PDL — это язык определения схемы для Pegasus, разработанный в качестве удобной и лаконичной замены старого формата на основе JSON. Формат схемы PDSC.

Создание схемы

Pegasus поддерживает различные типы схем: записи, Примитивные типы, перечисления, массивы, Карты, Союзы, Фиксированные и Typerefs. Записи, Enums и Typerefs имеют имена (Именованные схемы) и поэтому могут быть определены как схемы верхнего уровня. Именованные схемы могут указывать необязательное пространство имен, чтобы избежать конфликта имен между схемами с одинаковыми именами. Имя с префиксом пространства имен с использованием точки ( . ) разделитель становится полное имя (FQN) схемы. Именованные схемы могут быть ссылаются из других схем, используя полное имя.

Каждая схема верхнего уровня должна храниться в отдельном файле с расширением . pdl . Имя файла должно совпадать с именем схемы, а структура каталогов должна соответствовать пространству имен (подобно тому, как организованы классы Java).

Генератор кода Pegasus реализует преобразователь, аналогичный классу Java. грузчики. Если есть ссылка на именованную схему, генератор кода попытается для поиска файла в пути распознавателя генератора кода. Путь резольвера похоже на путь к классам Java. Полное имя именованной схемы будет быть переведено в относительное имя файла. Относительное имя файла вычисляется замена точек ( . ) в полном имени с помощью разделителя пути к каталогу (обычно /) и добавление расширения .pdl . Это относительное имя файла выглядело используя каждое место в пути распознавателя, пока не найдет файл, содержащий названная схема.

Тип записи

Записи являются наиболее распространенным типом схем Pegasus и обычно точку при определении моделей данных с помощью Pegasus. Запись представляет собой именованный сущность с полями, представляющими атрибуты этой сущности. Поля могут быть примитивные типы, перечисления, объединения, карты, массивы, другие записи или любой допустимый Pegasus тип.

Например:

 пространство имен com.example.time
Дата записи {
  день: инт
  месяц: инт
  год: инт
}
 

В приведенном выше примере определяется запись с именем Дата . Это определено в nameapce com.example.time , давая ему полное имя com.example.time.Date . Таким образом, эта схема должна быть определена в следующем файле

 /pegasus/com/example/time/Date.pdl.
 

На запись Date можно ссылаться в других схемах:

 пространство имен com.example.models
импортировать com.example.time.Date
запись пользователя {
  имя: строка
  день рождения: Дата
}
 

В приведенном выше примере определяется запись с именем User :

  • Эта запись использует пространство имен com.example.models . Таким образом, полностью полное имя: com. example.models.User .
  • Эта запись определяет два поля: имя и день рождения .
  • имя — это примитивное поле типа string .
  • день рождения ссылается на тип com.example.time.Date из первого примера
  • PDL поддерживает Java, как функция импорта , которая позволяет вам определять ссылки к внешним типам, а затем использовать их в схеме, используя их простое имя.

Атрибуты поля записи

Pegasus поддерживает дополнительные функции для определения поведения полей в записывать.

Поля записи могут быть определены как необязательные.

В Pegasus поле обязательно, если поле явно не объявлено как необязательный с использованием ключевого слова необязательный . Необязательное поле может присутствовать или отсутствует в структуре данных в памяти или сериализованных данных.

В сгенерированных клиентских привязках Pegasus предоставляет методы has[Field] (например, hasBirthDay() ), чтобы определить, присутствует ли необязательное поле.

Например:

 пространство имен com.example.models
импортировать com.example.time.Date
запись пользователя {
  имя: строка
  день рождения: необязательно Дата
}
 

В приведенном выше примере поле дня рождения определено как необязательное.

Поля записи могут иметь значения по умолчанию.

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

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

В привязках, созданных Pegasus, методы доступа get[Field] возвращают значение поле, в котором оно присутствует, или значение по умолчанию из схемы, если поле отсутствующий. Привязки также предоставляют специализированный метод доступа get, который позволяет вызывающая сторона, чтобы указать, должно ли быть возвращено значение по умолчанию или ноль, когда Доступ к отсутствующему полю осуществляется.

Дополнительные сведения см. в GetMode сведения о доступе к необязательным полям и значениям по умолчанию.

Например:

 пространство имен com.example.models
импортировать org.example.time.Date
запись пользователя {
  имя: строка
  день рождения: необязательно Дата
  isActive: логическое значение = истина
}
 

В приведенном выше примере определяется логическое поле isActive , которое имеет значение по умолчанию. верно .

Встроенные схемы

В Pegasus записи и другие именованные схемы не обязательно должны быть схемами верхнего уровня. Они могут быть встроены в другие схемы записей.

Например:

 пространство имен com.example.models
импортировать com.example.time.Date
запись пользователя {
  имя: строка
  день рождения: необязательно Дата
  isActive: логическое значение = истина
  адрес: запись Адрес {
    состояние: строка
    почтовый индекс: строка
  }
}
 

Запись адреса в приведенном выше примере встроена. Он наследует пространство имен родительская запись User , что делает ее полное имя com.example.models.Address .

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

Например:

 пространство имен com.example.models
импортировать com.example.time.Date
запись пользователя {
  имя: строка
  день рождения: необязательно Дата
  isActive: логическое значение = истина
  адрес: {
    пространство имен com.example.models.address
    адрес записи {
      состояние: строка
      почтовый индекс: строка
    }
  знак равно
    "состояние": "CA",
    "zipCode": "12345"
  }
}
 

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

Строки документа

Типы и поля Pegasus могут быть задокументированы с помощью «строки документа», следующих за Комментарии в стиле Java.

  • Комментарии, использующие синтаксис /** */ , рассматриваются как документация по схеме. Они будут включаться в представление в памяти и в сгенерированные классы привязки.
  • Комментарии с использованием синтаксиса /* */ или // разрешены, но не рассматриваются как схема документация.

Например:

 пространство имен com.example.models
импортировать com.example.time.Date
/**
 * Запись, представляющая пользователя в системе.
 */
запись пользователя {
  /** Имя пользователя */
  имя: строка
  /** День рождения пользователя */
  день рождения: необязательно Дата
  // TODO: Может ли это быть перечислением?
  /** Статус пользователя. */
  isActive: логическое значение = истина
}
 

Deprecated

Pegasus поддерживает маркировку типов или полей как устаревших путем добавления @deprecated аннотация. Сведения об устаревании из схемы будут перенесены в привязки, созданные на разных языках. В языке Java классы, методы получения и установки, сгенерированные для устаревшие типы будут помечены как устаревшие.

Рекомендуется указать строку, описывающую причину устаревания и альтернатива как значение для @устаревшая аннотация .

Устарело поле:

 пространство имен com.example.models
импортировать com.example.time.Date
запись пользователя {
  имя: строка
  @deprecated = "Вместо этого используйте день рождения."
  Год рождения: int
  день рождения: Дата
}
 

Устаревшая запись:

 пространство имен com.example.models
@deprecated = "Вместо этого используйте тип Person."
запись пользователя {
  имя: строка
}
 

См. документацию Enum и устаревание для получения подробной информации об устаревших символах перечисления.

Включая поля

Записи Pegasus поддерживают включение полей из одной или нескольких других записей. Когда включена запись, все ее поля будут включены в текущую запись. Это не включает никаких других атрибутов другой записи.

Включения являются транзитивными, если запись A включает запись B, а запись B включает запись C, запись A содержит все поля, объявленные в записи A, записи B и запись C.

Значением атрибута «include» должен быть список записей или typerefs записи. Указание в этом списке типов, не являющихся записями, является ошибкой.

Например:

 пространство имен com.example.models
/**
 * Пользователь включает поля AuditStamp, Пользователь будет иметь поля firstName из
 * себя и поля createdAt и updatedAt из AuditStamp.
 */
запись Пользователь включает AuditStamp {
  имя: строка
}
 
 пространство имен com.example.models
/**
 * Общая запись для представления ревизионных штампов.
 */
запись AuditStamp {
  /** Время в миллисекундах с момента создания этой записи */
  createdAt: долго
  /** Время в миллисекундах с момента последнего обновления этой записи */
  обновлено: долго
}
 

Функция включения позволяет включать поля из нескольких записей.

Например:

 пространство имен com.example.models
/** Общая запись для указания тегов версии записи */
запись VersionTag {
  тег версии: строка
}
 
 пространство имен com.example.models
/**
 * Пользователь включает поля AuditStamp, Пользователь будет иметь поля firstName из
 * себя и поля createdAt и updatedAt из AuditStamp.
 */
запись Пользователь включает AuditStamp, VersionTag {
  имя: строка
}
 

Примечание: Включение записи не подразумевает наследования, это просто удобство для уменьшения дублирования при написании схем.

Примитивные типы

В приведенных выше примерах уже представлены int , long , string и boolean примитивные типы, поддерживаемые Pegasus. Полный список поддерживаемых типов примитивов Pegasus: int , long , float , двойной , логическое значение , строка и байт .

Фактические типы, используемые для примитивов, зависят от конкретного языка обязательная реализация. Дополнительные сведения о привязках Java для примитивов Pegasus см. Примитивные типы

Примитивные типы не могут быть названы (кроме как через typerefs) и, следовательно, не могут быть определены как схемы верхнего уровня.

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

 пространство имен com.example.models
запись WithPrimitives {
  intField: интервал
  longField: длинный
  floatField: плавать
  двойное поле: двойной
  booleanField: логическое
  stringField: строка
  bytesField: байты
}
 

Примитивные типы со значениями по умолчанию:

 пространство имен com.example.models
запись WithPrimitiveDefaults {
  intWithDefault: интервал = 1
  longWithDefault: длинный = 3000000000
  поплавок по умолчанию: поплавок = 3,3
  doubleWithDefault: двойной = 4.4E38
  логическое значение по умолчанию: логическое значение = истина
  stringWithDefault: строка = "ПО УМОЛЧАНИЮ"
  bytesWithDefault: байты = "\ u0007"
}
 

Тип перечисления

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

Например:

 пространство имен com.example.models
перечисление UserStatus {
  АКТИВНЫЙ
  ПРИОСТАНОВЛЕННЫЙ
  НЕАКТИВНЫЙ
}
 

На перечисления можно ссылаться по имени в других схемах:

 пространство имен com.example.models
запись пользователя {
  имя: строка
  статус: Статус пользователя
}
 

Перечисления также могут быть определены встроенными:

 пространство имен com.example.models
запись пользователя {
  имя: строка
  статус: Статус пользователя
  suspendReason: перечисление StatusReason {
    FLAGGED_BY_SPAM_CHECK
    REPORTED_BY_ADMIN
  }
}
 

Документация по перечислениям и устаревание

Комментарии по документам и устаревание могут быть добавлены непосредственно к отдельным символам перечисления.

Например:

 пространство имен com.example.models
/**
 * Определяет состояния пользователя в системе.
 */
перечисление UserStatus {
  /**
   * Представляет активного пользователя. 
   */
  АКТИВНЫЙ
  /**
   * Представляет пользователя, приостановленного по какой-либо причине.
   */
  ПРИОСТАНОВЛЕННЫЙ
  /**
   * Представляет пользователя, который удалил/деактивировал свою учетную запись.
   */
  @deprecated = "Использовать НЕАКТИВНО для пользователей, ожидающих удаления. Удаленных пользователей не должно быть в системе"
  УДАЛЕНО
  /**
   * Представляет пользователей, запрошенных для удаления и находящихся в процессе удаления.
   */
   НЕАКТИВНЫЙ
}
 

Значения перечисления по умолчанию

Чтобы указать значение по умолчанию для поля перечисления, используйте строковое представление символ enum для установки по умолчанию.

Например:

 пространство имен com.example.models
запись пользователя {
  имя: строка
  статус: Статус пользователя = "АКТИВНЫЙ"
  suspendReason: перечисление StatusReason {
    FLAGGED_BY_SPAM_CHECK
    REPORTED_BY_ADMIN
  } = "FLAGGED_BY_SPAM_CHECK"
}
 

Тип массива

Пегас Массивы определяются как однородные наборы некоторых типов «элементов», который может быть любым допустимым типом PDL. Массивы упорядочены, так как элементы в массиве имеют определенный порядок, и этот порядок будет соблюдаться, когда данные сериализуются, отправляются по сети и десериализуются.

Несколько примеров ниже для определения массивов и значений по умолчанию для них.

Примитивные массивы:

 пространство имен com.example.models
запись WithPrimitivesArray {
  целые числа: массив [целое число]
  длинные: массив [длинный]
  поплавки: массив [поплавок]
  удваивается: массив [двойной]
  логические значения: массив [логическое значение]
  строки: массив[строка]
  байты: массив [байты]
}
 

Примитивные массивы со значениями по умолчанию:

 пространство имен com.example.models
запись WithPrimitivesArrayDefaults {
  целые: массив[int] = [1, 2, 3]
  длинные: массив [длинный] = [3000000000, 4000000000]
  поплавки: массив [поплавок] = [3.3, 2.5]
  удваивается: массив [двойной] = [4.4E38, 3.1E24]
  логические значения: массив [логическое значение] = [истина, ложь]
  строки: массив [строка] = ["привет"]
  байты: массив [байты] = ["\u0007"]
}
 

Массивы записей или перечислений:

 пространство имен com. example.models
запись SuspendedUsersReport {
  пользователи: массив[Пользователь]
  причины: массив[SuspendReason]
}
 

Массивы записей или Enum со значениями по умолчанию:

 пространство имен com.example.models
запись SuspendedUsersReport {
  пользователи: массив [Пользователь] = [{ "firstName": "Джокер" }, { "firstName": "Дарт"}]
  причины: массив[SuspendReason] = ["FLAGGED_BY_SPAM_CHECK"]
}
 

Тип карты

Карты определяются с типом ключа и типом значения. Тип значения может быть любым допустимым типом PDL, но в настоящее время строка это единственный поддерживаемый тип ключа. Записи на карте упорядочены , а не , и порядок может измениться при сериализации/десериализации данных.

Несколько примеров ниже для определения карт и значений по умолчанию для них.

Примитивные карты:

 пространство имен com.example.models
запись WithPrimitivesMap {
  целые: карта[строка, целое]
  длинные: карта[строка, длинный]
  поплавки: карта[строка, поплавок]
  двойные: карта[строка, двойная]
  логические значения: карта[строка, логическое значение]
  строки: карта[строка, строка]
  байты: карта[строка, байты]
}
 

Примитивные карты со значениями по умолчанию:

 пространство имен com. example.models
запись WithPrimitivesMapDefaults {
  ints: карта[строка, int] = { "int1": 1, "int2": 2, "int3": 3}
  longs: map[string, long] = { "long1": 3000000000, "long2": 4000000000 }
  поплавки: карта[строка, поплавок] = { "поплавок1": 3.3, "поплавок2": 2.1}
  двойные: карта [строка, двойная] = {"double1": 4.4E38, "double2": 3.1E24}
  логические значения: map[string, boolean] = { "boolean1": true, "boolean2": true, "boolean3": false }
  строки: карта[строка, строка] = { "строка1": "привет", "строка2": "мир" }
  байты: карта [строка, байты] = { "байты": "\ u0007" }
}
 

Карты со сложными значениями:

 пространство имен com.example.models
запись UserReport {
  /** Пользователи сгруппированы по статусу. Ключ — это строковое представление перечисления состояния */
  usersByStatus: карта[строка, массив[Пользователь]]
  /**
   * Количество пользователей, сгруппированных по firstName, а затем по статусу.
   * Ключ первого уровня — это имя пользователя.
   * Ключ второго уровня представляет собой строковое представление статуса. 
   */
  countByFirstNameAndStatus: карта[строка, карта[строка, int]]
}
 

Тип соединения

Union — это мощный способ моделирования данных, которые могут быть разных типов одновременно. разные сценарии. Поля записи, имеющие такое поведение, могут быть определены как Тип объединения с ожидаемыми типами значений в качестве членов.

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

Полные имена типов членов также служат в качестве «ключей членов» (также называемые «тегами объединения»), и определить, какие данные о типе члена объединения хранятся. Эти используются для представления того, какой элемент присутствует при сериализации данных.

Например:

 пространство имен com.example.models
запись Аккаунт {
  /**
   * Владелец этого аккаунта. Учетные записи могут принадлежать как одному пользователю, так и
   * группа пользователей. 
   */
  владелец: союз[Пользователь, Группа пользователей]
}
 

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

Union со значением по умолчанию:

 пространство имен com.example.models
запись Аккаунт {
  /**
   * Владелец этого аккаунта. Учетные записи могут принадлежать как одному пользователю, так и
   * группа пользователей.
   * По умолчанию все ваши учетные записи принадлежат CATS.
   */
  владелец: union[User, UserGroup] = { "com.example.models.User": { "firstName": "CATS" }}
}
 

Типы могут быть объявлены встроенными в определении объединения:

 пространство имен com.example.models
запись пользователя {
  имя: строка
  статус: Статус пользователя = "АКТИВНЫЙ"
  statusReason: союз [
    перечисление ActiveReason {
      НИКОГДА_ОТСУТСТВУЕТ
      SUSPENSION_CLEARED
    }
    перечисление SuspendReason {
      FLAGGED_BY_SPAM_CHECK
      REPORTED_BY_ADMIN
    }
    перечисление InactiveReason {
      USER_REQUESTED_DELETION
      REQUESTED_BY_ADMIN
    }
  ] = { "com. example.models.ActiveReason": "NEVER_SUSPENDED" }
}
 

Объединение с псевдонимами

Примечание: Объединение с псевдонимами — это новая функция схемы Pegasus. *language, и он может не полностью поддерживаться на языках, отличных от Java. Пожалуйста *проверьте уровень поддержки на всех *языки, которые вы собираетесь использовать, прежде чем использовать псевдонимы

Членам профсоюза может быть предоставлен псевдоним. Псевдонимы могут использоваться для создания союзы с членами того же типа или для лучшего именования членов союза.

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

  • того же примитивного типа
  • одноименного комплекса типа
  • массивов одинаковых или разных типов элементов
  • карты с одинаковыми или разными типами значений
  • typerefs разыменованы в тот же тип

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

Объединения с псевдонимами определяются как:

 объединение [псевдоним: тип, /* ... */]
 

Существует несколько ограничений, которые необходимо учитывать при указании псевдонимы для членов объединения,

  1. Псевдонимы должны быть уникальными для каждого члена в определении объединения.
  2. Псевдонимы должны быть указаны либо для всех членов объединения, либо ни для одного из них. определение.
  3. Псевдонимы не могут быть указаны для нулевых типов членов , что означает, что могут быть только одним пустым членом внутри определения объединения.

Пример объединения с псевдонимами:

 пространство имен com.example.models
/**
 * Запись с контактной информацией пользователя.
 */
запись Контакты {
  /** Основной номер телефона пользователя */
  основной номер телефона: союз[
    /** Номер мобильного телефона */
    номер мобильного телефона,
    /**
     * Рабочий телефон
     */
    Рабочий Номер Телефона,
    /** Номер домашнего телефона */
    домашний телефон
  ]
}
 

Так как все три члена профсоюза мобильный , работа и дом одного типа PhoneNumber , для этого объединения требуются псевдонимы.

Члены объединения с псевдонимами могут иметь строки документов и настраиваемые свойства. Это не поддерживается для членов союза без псевдонимов.

При использовании объединений с псевдонимами псевдоним должен использоваться как ключ в значении по умолчанию:

 пространство имен com.example.models
/**
 * Запись с контактной информацией пользователя.
 */
запись Контакты {
  /** Основной номер телефона пользователя */
  основной номер телефона: союз[
    /** Номер мобильного телефона */
    номер мобильного телефона,
    /**
     * Рабочий телефон
     */
    Рабочий Номер Телефона,
    /** Номер домашнего телефона */
    домашний телефон
  ] = {"мобильный": { "номер": "314-159-2653" }}
}
 

Typeref

Pegasus поддерживает новый тип схемы, известный как typeref. Typeref похож на typedef в C. Он не объявляет новый тип, а объявляет псевдоним для существующий тип.

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

Типовые ссылки полезны для различения различных вариантов использования одного и того же типа. За например, мы можем использовать typeref, чтобы различать строковое поле, содержащее URL-адрес из произвольного строкового значения или длинного поля, содержащего время эпохи в миллисекунды от универсального длинного значения.

Например:

 пространство имен com.example.models
/** Количество миллисекунд с полуночи 1 января 1970 года по всемирному координированному времени. */
typeref Время = длинное
 
 пространство имен com.example.models
/**
 * Общая запись для представления ревизионных штампов.
 */
запись AuditStamp {
  /** Время создания этой записи */
  createdAt: Время
  /** Время последнего обновления этой записи */
  обновленоВ: время
}
 

Typeref позволяет связать дополнительные метаданные с примитивными и безымянные виды. Эти метаданные можно использовать для предоставления документации или поддержки пользовательские свойства.

Typerefs можно использовать для именования анонимных типов.

Типовая ссылка позволяет ссылаться на распространенные безымянные типы, такие как массивы, карты, и союзы. Без typerefs пользователям, возможно, придется обернуть эти безымянные типы с помощью запись для их решения. Кроме того, пользователи могут вырезать и вставлять общие объявления типов, приводящие к ненужному дублированию и потенциально вызывающие несоответствия, если будущие изменения не будут корректно распространяться на все копии.

Например:

 пространство имен com.example.models
typeref PhoneContact = союз [
  /** Номер мобильного телефона */
  номер мобильного телефона,
  /**
   * Рабочий телефон
   */
  Рабочий Номер Телефона,
  /** Номер домашнего телефона */
  домашний телефон
]
 

Typerefs затем могут быть указаны по имени из любого другого типа:

 namespace com.example.models
запись Контакты {
  основнойтелефон: PhoneКонтакты
  вторичныйТелефон: PhoneКонтакты
}
 

Ссылки на типы можно использовать для указания пользовательских типов и преобразователей

Например, время Joda имеет удобный класс DateTime Java. Если мы хотим использовать этот класс в Java для представления даты и времени, все, что нам нужно сделать, это определить Пользовательский тип Pegasus, который к нему привязан:

 пространство имен com.example.models
@java.class = "org.joda.time.DateTime"
@java.coercerClass = "com.example.time.DateTimeCoercer"
typeref DateTime = строка
 

Коэрсер отвечает за преобразование «ссылочного» типа Pegasus в этом чехол «строка» для Joda DateTime класс.

См. [Привязка Java] (https://linkedin.github.io/rest.li/java_binding#custom-java-class-binding-for-primitive-types) для получения более подробной информации об определении и использовании пользовательских типов.

Фиксированный тип

Фиксированный тип используется для определения схем с фиксированным размером с точки зрения количества байт.

Например:

 пространство имен com.example.models
фиксированный MD5 16
 

В приведенном выше примере определяется тип с именем MD5 , который имеет размер 16 байт .

Imports

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

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

 namespace com.example.models
запись AuditStamp {
  createdAt: com.example.models.time.Time
  updateAt: com.example.models.time.Time
}
 

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

 пространство имен com.example.models
импортировать com.example.models.time.Time
запись AuditStamp {
  createdAt: Время
  обновленоВ: время
}
 

Примечание:

  • Любой тип, который не импортирован и не входит в пространство имен, из которого он ссылка должна быть указана полным именем.
  • Импорт имеет приоритет, когда Pegasus разрешает идентификаторы в схеме. Так будьте осторожны при добавлении импорта, который конфликтует с типами в том же пространстве имен корневого документа.
  • Использование импорта следующими способами приведет к ошибкам парсера PDL. Вам следует избегайте этого.
    1. Импорт типов, объявленных внутри документа.
    2. Импорт типов в корневом пространстве имен документа.
    3. Объявление типов, конфликтующих с существующими импортами.

Свойства

Свойства могут использоваться для представления произвольных данных и добавления к записям, записи поля, перечисления, символы перечисления или псевдонимы членов объединения. Свойства определены используя 9[a-zA-Z]+$» имя: строка }

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

Добавьте свойства в перечисление и символы перечисления:

 пространство имен com.example.models
/**
 * Определяет состояния пользователя в системе. 
 */
@hasPii = ложь
перечисление UserStatus {
  /**
   * Представляет активного пользователя.
   */
  @stringFormat = "активный"
  АКТИВНЫЙ
  /**
   * Представляет пользователя, приостановленного по какой-либо причине.
   */
   @stringFormat = "приостановлено"
  ПРИОСТАНОВЛЕННЫЙ
  /**
   * Представляет пользователя, который удалил/деактивировал свою учетную запись.
   */
  @deprecated = "Использовать НЕАКТИВНО для пользователей, ожидающих удаления. Удаленных пользователей не должно быть в системе"
  @stringFormat = "удалено"
  УДАЛЕНО
  /**
   * Представляет пользователей, запрошенных для удаления и находящихся в процессе удаления.
   */
   @stringFormat = "не активен"
   НЕАКТИВНЫЙ
}
 

Добавить свойства для членов объединения с псевдонимом:

 пространство имен com.example.models
typeref PhoneContact = союз [
  /** Номер мобильного телефона */
  @allowText = истина
  номер мобильного телефона,
  /**
   * Рабочий телефон
   */
  @allowText = ложь
  Рабочий Номер Телефона,
  /** Номер домашнего телефона */
  @allowText = ложь
  домашний телефон
]
 

Значения свойства могут быть любым допустимым типом JSON:

Например:

 @prop = 1
 
 @prop = "строка"
 
 @prop = [1, 2, 3]
 9[а-я]+$"
 

Пакет

Пакет используется для определения пространства имен привязки языка для именованной схемы.

Например:

 пространство имен com.example.models
пакет com.example.api
запись пользователя {
  имя: строка
}
 

Если пакет не указан, класс привязки языка для именованной схемы будет использовать пространство имен в качестве пространства имен по умолчанию.

В привязке Java пакет сгенерированного класса будет определяться пакетом , указанный в схема.

Побег

Есть некоторые ключевые слова которые зарезервированы в Pegasus. Если эти зарезервированные ключевые слова используются для определения каких-либо имена или идентификаторы, их необходимо экранировать с помощью обратных кавычек: ` `.

Экранирование ключевого слова

 пространство имен com.example.models
запись PdlKeywordEscaping {
  `пространство имен`: строка
  `запись`: строка
  `нуль`: строка
  `перечисление`: строка
  имя_записи: запись `запись` { }
}
 

Пространство имен/экранирование пакета

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

 пространство имен com.example.models.`record`
пакет com.example.models.`typeref`
импортировать com.example.models.`необязательно`
запись NamespacePackageEscaping { }
 

Экранирование ключа свойства

Если вы хотите, чтобы Pegasus рассматривал имя ключа свойства с точками как один строковый ключ, пожалуйста, используйте обратные кавычки, чтобы избежать такой строки. Экранирование ключей свойств также может быть используется для экранирования зарезервированных ключевых слов, таких как «пространство имен», или для экранирования не буквенно-цифровые символы в ключах.

Например:

 пространство имен com.example.models
запись пользователя {
  @`namespace` = "foo.bar"
  @validate.`com.linkedin.CustomValidator` = "foo"
  имя: строка
}
 

РЕШЕНИЕ: Java-программа для поиска объединения двух массивов

Отношения между террористами и государством Государства, поддерживающие террористические группы, известны как «государства, спонсоры терроризма». В 2008 году Государственный департамент США указал, что Куба, Иран, Судан и Сирия являются государственными спонсорами терроризма. Государство может быть любым суверенным политическим образованием, таким как страна, или входить в состав более крупного государства или нации. Государства имеют свои собственные своды законов и судов и поэтому могут диктовать свою собственную политику и правила. Это означает, что они могут оказывать финансовую и политическую поддержку террористическим группам. Когда государства поддерживают террористические группы, они часто получают поддержку от групп в ответ. Террористические группы могут предоставлять государствам защиту, доступ к оружию или разведывательной информации. Отношения между государствами и террористическими группами часто оказывают негативное влияние на социальные, политические и экономические системы этих государств. Несмотря на такое негативное влияние на правительство и его народ, многие государства не прекращают отношений с террористическими группировками. Поэтому возникает вопрос, почему некоторые государства поддерживают террористические группы? В некоторых случаях поддержка, которую оказывают террористические группы, обеспечивает ресурсы, к которым государство в противном случае не имеет доступа. В других случаях террористические группы оказывают военную поддержку против соперничающих с государством врагов. Чтобы подготовиться к этому обсуждению: Просмотрите назначенные страницы в Главе 4 в тексте курса «Терроризм в перспективе». Подумайте о финансовых отношениях между государствами и террористическими группами. Просмотрите статью Главы 4 «Высшая организация» в тексте курса «Терроризм в перспективе». Рассмотрите историю Халфана Мохамеда и подумайте об отношениях террористических групп с государствами. Прочтите статью «Пассивные спонсоры терроризма». Подумайте о влиянии спонсируемого государством терроризма. Просмотрите видеосегмент PBS «Укрепление талибов». Рассмотрим отношения между талибами и правительством Афганистана. Просмотрите видеофрагмент PBS «Вызов прямо за границей». Подумайте о поддержке талибов пакистанской армией. Просмотрите статью «Слабое государство и глобальные угрозы: факт или вымысел?» Подумайте о роли слабых и бедных государств в поощрении терроризма. Выберите одну террористическую группу, поддерживаемую государством, для использования в этом задании. Рассмотрите характер отношений между террористической группой и государством. Подумайте о том, как эти отношения влияют на террористов. группа и государство. Имея в виду следующие мысли: Опубликуйте в День 4 краткое описание выбранной вами террористической группы и государства, которое поддерживает эту группу. Затем объясните характер отношений между ними. Наконец, объясните влияние отношений как на террористическую группу, так и на государство. Быть конкретной. Примечание. Укажите название выбранной вами террористической группы в первой строке вашего сообщения. Вам будет предложено ответить коллеге, который выбрал террористическую группу, которую вы не выбрали. Обязательно подкрепляйте свои сообщения и ответы конкретными ссылками на учебные ресурсы. Полторы страницы, по крайней мере, с тремя ссылками… МНОГОКРАТНОЕ ИСПОЛЬЗОВАНИЕ ИНТЕКСТА ТРЕБУЕТСЯ ССЫЛКА И НОМЕР СТРАНИЦЫ Важно, чтобы вы охватывали все темы, указанные в назначение. Освещение темы не означает упоминание темы, НО представление объяснения из контекста этики и литературы для этого класса. Чтобы получить максимальное количество баллов, вам необходимо следовать требованиям, перечисленным для этого задания 1) посмотрите на ограничения страницы 2) просмотрите и следуйте Правила APA 3) создавайте подзаголовки для обозначения ключевых разделов, которые вы представляете, и 4) не допускайте типографских ошибок и ошибок построения предложений. ПОМНИТЕ, В ФОРМАТЕ APA НАЗВАНИЯ ЖУРНАЛОВ И НОМЕРА ТОМА ВЫДЕЛЕНЫ КУРСИВОМ. ЧтенияПримечание. Чтобы получить доступ к необходимым ресурсам библиотеки Уолдена на этой неделе, щелкните ссылку на Список литературы по курсу, который находится в разделе «Материалы курса» вашей программы. Выдержка из книги: Стерн, Дж. (2007). Абсолютная Организация. В Махан, С. и Грисет, П.Л., Терроризм в перспективе. (стр. 154-179) Терроризм в перспективе, 2-е издание, Стерн, Дж. Авторские права, 2008 г., Sage Publications, Inc. — Книги. Перепечатано с разрешения Sage Publications, Inc. — Книги через Центр проверки авторских прав. Статья: Byman, D. (2005). Пассивные спонсоры терроризма. Survival, 47 (4), 117–144. Выдержка из книги: Schear, JA (Ed.). Хрупкие государства и неуправляемые пространства. В Cronin, P.M. (ред.), Глобальная стратегическая оценка 2009 г.: роль Америки в области безопасности в меняющемся мире (стр. 119–144). Вашингтон, округ Колумбия: Издательство Университета национальной обороны. Получено с http://permanent.access.gpo.gov/fdlp537/FDLP537/ww… Статья: Патрик С. (2006 г.). Слабое государство и глобальные угрозы: правда или вымысел? Вашингтон Ежеквартально, 29(2), 27–53. MediaWeb Video: Gaviria, M., & Smith, M. (писатели). (2008, 21 октября). Военный брифинг [эпизод телесериала]. Ин М. Гавириа (продюсер), Frontline. Бостон: Образовательный фонд WGBH. Получено с http://www.pbs.org/wgbh/pages/frontline/warbriefin… oГлава 2, «Усиление талибов» oГлава 4, «Вызов прямо за границей» Дополнительные ресурсыСтатья: Byman, D. (2006 ). Такие друзья, как эти: Борьба с повстанцами и война с терроризмом. Международная безопасность, 31(2), 70–115. Используйте Военную и правительственную коллекцию и выполните поиск по названию статьи. Видео: Смит, М. (сценарист) и Гавириа, М. (режиссер). (2002, 21 ноября). В поисках Аль-Каиды [эпизод телесериала]. В М. Смит и М. Гавириа (продюсеры), Frontline. Бостон: Образовательный фонд WGBH. Получено с http://www.pbs.org/wgbh/pages/frontline/shows/sear…Видео: Смит М. (сценарист) и Гавириа М. (директор). (н.д.). На территории племен Пакистана [Видеофайл]. Получено с http://www.pbs.org/wgbh/pages/frontline/shows/sear… Статья: Takeyh, R., & Gvosdev, N. (2002). Нужен ли террористическим сетям дом? Вашингтон Ежеквартально, 25 (3), 97–108. Используйте Военную и правительственную коллекцию и выполните поиск по названию статьи. Веб-сайт: Управление координатора по борьбе с терроризмом. Получено с http://www.state.gov/j/ct/

Найти пересечение двух несортированных массивов

Уровень сложности: Средний
Вопрос задан в Google

616

0 90
Понимание проблемы

Описание проблемы: Даны два массива целых чисел A[] и B[] размера m и n соответственно. Нам нужно найти пересечение этих двух массивов. Пересечение двух массивов представляет собой список различных чисел, которые присутствуют в обоих массивах. Числа в перекрестке могут быть в любом порядке.

Например,

Ввод: A[] = {1,4,3,2,5, 8,9}, B[] = {6,3,2,7,5}

Вывод: { 3,2,5}

Ввод: A[] = {3,4,6,7,10, 12, 5}, B[] = {7,11,15, 18}

Вывод: {7}

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

  1. Можете ли вы изменить массивы? ( Ответ: Да)
  2. Каковы ограничения на длину и элементы массива? ( Ответ: m>n , 1 <= m,n <= 10^5, -10^5 <= A[i], B[i] <= 10^5)
  3. Могут ли в массиве или между массивами быть повторяющиеся элементы? ( Ответ: Да, такая возможность существует)
Разработка эффективных решений

Мы обсуждаем четыре способа решения этой проблемы:

  1. Перебор: Использование вложенных циклов подход с двумя указателями
  2. Использование хэш-таблицы
1. Полный перебор: использование вложенных циклов

Для каждого элемента в A[] выполните линейный поиск в B[]. Продолжайте добавлять общие элементы в список. Чтобы убедиться, что номера в списке уникальны, либо проверьте перед добавлением новых номеров в список, либо удалите дубликаты из списка после добавления всех номеров.

Псевдокод
 int[] findIntersection(int A[], int B[], int m, int n)
{
    интервал []
 
    для ( я = 0 до m-1 )
    {
        для ( j = 0 до n-1 )
        {
           если ( А[i] == B[j] )
              если ( A[i] не в ответе)
                  ответ.добавить(А[я])
        }
    }
 
    возврат ответа
} 
Анализ сложности

В решении есть два цикла, где внешний цикл выполняется n раз, а внутренний цикл выполняется m раз. Так что в худшем случае временная сложность = О(м*н) .

Пространство Сложность: в худшем случае = O(1) ( Почему? Некоторое пространство занимает список ответов. Почему это не принимается во внимание?)

Критические идеи!
  • Какова будет временная и пространственная сложность удаления дубликатов из массива размера n?
  • Как мы можем улучшить временную сложность?
2. Сортировка и бинарный поиск

В методе грубой силы мы выбираем элементы из массива A[] и линейно ищем их в массиве B[]. Мы могли бы повысить эффективность поиска элементов, если бы сортировали B[] и применяли бинарный поиск для поиска элементов. Двоичный поиск занимает O(logn) временную сложность.

Действия по решению
  1. Объявить список ответов.
  2. Сортировать массив B[] по возрастанию.
  3. Поиск каждого элемента в A[] в отсортированном массиве B[]
  4. Если элемент найден, добавить его в список ответов
  5. Вернуть список ответов
Псевдокод bool binary_search_9006arch (целое B[], целое n, целое K) { int низкий = 0, высокий = n в то время как (низкий <= высокий) { int mid = низкий + (высокий-низкий) / 2 если ( B [середина] == K ) вернуть Истина иначе если( B[mid] > K ) высокий = средний — 1 еще низкий = средний + 1 } вернуть ложь } int[] findIntersection(int A[], int B[], int m, int n) { интервал [] сортировать(B,n) для (i = 0 до m-1) { если (двоичный_поиск (B, n, A [i])) ответ. добавить(А[я]) } возврат ответа }
Анализ сложности

Временная сложность: Сортировка массива B[] + Поиск всех элементов A[] в B[] = O(nlogn) + O(mlogn) = O(nlogn + mlogn)

Сложность пространства: если мы используем сортировку слиянием, то сложность пространства равна O(n), иначе, если мы используем сортировку кучей, сложность пространства равна O(1).

Критические идеи!
  • Здесь мы отсортировали меньший массив. Что, если мы отсортируем больший массив для решения? Как меняется временная сложность?
  • Какой будет временная и пространственная сложность, если мы используем быструю сортировку? Сравните различные алгоритмы сортировки
  • Какова была бы пространственная сложность, если бы мы использовали рекурсивный бинарный поиск для реализации?
  • Подготовьте список задач, в которых вы можете применить идею сортировки и бинарного поиска.
3. Сортировка и подход с двумя указателями

Если отсортированы и A[] и B[], мы можем использовать подход с двумя указателями. На каждом шаге мы сравниваем один элемент A[] с одним элементом B[]. Если оба равны, мы добавляем его в список, иначе идем дальше.

Действия по решению
  1. Объявите список ответов.
  2. Отсортировать оба массива в порядке возрастания.
  3. Инициализировать переменные i и j в отсортированном массиве A[] и B[] соответственно. i = 0 и j = 0
  4. Запустить цикл, пока i < m и j < n (Почему ' и ‘, а не ‘ или ‘?)
  • Если A[i] == B[j ], добавьте A[i] в ​​список и увеличьте i и j
  • Если A[i] < B[j], увеличьте i на 1
  • Если A[i] > B[j], увеличьте j на 1

5. Вернуть список ответов.

Визуализация решения
Псевдокод
 int[] findIntersection(int A[], int B[], int m, int n)
{
    интервал []
    сортировать(А, м)
    сортировать (В, п)
    я = 0, j = 0
    в то время как ( я < m и j < n )
    {
        если ( A[i] == B[j] и A[i] не в ответах)
          {
            ответ. добавить(А[я])
            я = я + 1
            дж = дж + 1
          }
 
        иначе, если ( A[i] < B[j] )
            я = я + 1
 
        еще
            дж = дж + 1
    }
 
    возврат ответа
} 
Анализ сложности

Временная сложность: Сортировка массива A[] + Сортировка массива B[] + Использование подхода с двумя указателями = O(mlogm) + O(nlogn) + O(n+m) = O(mlogm + nlogn)

Space Сложность: если используется mergeSort, то O(m), иначе в heapSort, O(1)

Критические идеи!
  • Почему мы увеличиваем указатели, когда A[i]>B[j] или A[i]
  • Этот алгоритм работает нормально, когда элементы повторяются? Как вы можете гарантировать, что элементы в списке ответов уникальны?
  • Временная сложность цикла while составляет O(m+n) - Почему?
  • Почему идея с двумя указателями прекрасно работает для отсортированного массива?
  • Подготовьте список задач, для решения которых вы можете применить идею подхода с двумя указателями.
4. Использование хеш-таблицы

Мы создадим хеш-таблицу меньшего массива, чтобы наш поиск стал быстрее и все элементы появлялись только один раз. Теперь для каждого элемента большего массива мы выполним операцию поиска этого элемента в хеш-таблице. Операция поиска в хеш-таблице в среднем выполняется за O(1).

Шаги решения
  1. Создайте хеш-таблицу размера n
  2. Добавьте все элементы массива B[] в хэш-таблицу
  3. Для каждого элемента A[] найдите этот элемент в хэш-таблице . Если найден, добавьте элемент в список ответов
  4. Вернуть список ответов
Визуализация решения
Псевдокод
 int findIntersection(int m[], int B[], int B н)
{
    интервал []
    Возьмите HashTable H размера n
    для (i = 0 до n-1)
    {
        H.insert(B[i])
    }
 
    для (я = 0 до m-1)
    {
        если(H.Search(A[i]) верно)
           ответ. добавить(А[я])
    }
    возврат ответа
} 
Анализ сложности

Временная сложность = Вставка n элементов A[] в хеш-таблицу + Временная сложность поиска m элементов B[] в хеш-таблице

= m* O(1) + n * O(1)) = O(m+n)

Сложность пространства = O(n), для хранения вспомогательной хеш-таблицы

Критические идеи!
  • Нужно ли модифицировать алгоритм, если элементы повторяются? Есть ли возможность повторения элементов в списке ответов?
  • Как изменится временная и пространственная сложность, если хеш-таблица создается для большего массива, а не для меньшего? Что эффективнее?
  • Какова наихудшая временная сложность поиска элемента в хеш-таблице?
  • Какие другие структуры данных могут помочь эффективно решить эту проблему? Полезен ли самобалансирующийся BST?
Сравнение различных решений
Предлагаемые проблемы для решения
  • Найти пересечение трех отсортированных массивов
  • Найти объединение двух отсортированных массивов
  • Найти пересечение двух связанных списков
  • Объединить два отсортированных массива пар в массиве, сумма которых равна K.