Слияние двух массивов java

Я пытаюсь создать третий отсортированный массив c из двух ранее созданных массивов a и b; однако я получаю несколько ошибок в методе слияния, которые говорят: "Тип выражения должен быть типом массива, но он разрешен для OrdArray". Я уже много часов нахожусь, и чувствую, что мой мозг теперь месит. Кто-нибудь может мне помочь?

4 ответа

1 Решение ajb [2015-09-08 06:42:00]

OrdArray не является типом массива (несмотря на имя); поэтому вы не можете индексировать его как массив. Это выражение

где a является OrdArray , не имеет смысла. Java не дает вам способ определить свой собственный оператор [] для классов (в отличие от С++). Поэтому вам нужно добавить метод OrdArray , чтобы вернуть элемент по заданному индексу, что-то вроде

Хотя я не уверен, что это то, что вы хотите, поскольку вы объявили c как int[] , а массив в OrdArray – long[] , поэтому я не уверен, что вы пытаетесь сделать.

EDIT: После прочтения вашего комментария я понял, что метод merge находится внутри класса OrdArray . Я пропустил это раньше. В этом случае вам не нужно добавлять метод get ; вы можете напрямую получить доступ к приватным полям ваших параметров OrdArray . В вашем методе:

вы хотите получить в частном массиве a , который вы объявляете для каждого OrdArray . Если вы просто используете a , переменная будет ссылаться на OrdArray , которая не является массивом (как описано выше); для доступа к long[] a , принадлежащему OrdArray a , вам нужно сказать

Это может показаться запутанным для читателя, поэтому я предлагаю придумать лучшее имя, чтобы вы не вызывали две вещи a . Возможно, data ?

Еще несколько вещей: вы используете merge следующим образом: c.merge(a,b) , что означает, что merge – это метод экземпляра, а c – это экземпляр, над которым вы работаете. Но ваш метод ничего не делает с текущим экземпляром. ( c , который вы объявляете в merge , является локальной переменной, которая не имеет ничего общего с c , которую вы используете при вызове merge .) Прямо сейчас, ваш метод будет очень трудным для создания локального array c , но затем он просто отбрасывает его. Вам либо необходимо (1) исправить метод, чтобы он установил массив a (или data ) в текущем экземпляре; или (2) сделать его методом static и заставить метод возвращать новый массив как результат функции. Я не знаю, какой из них вам нужен ваш инструктор.

Читайте также:  Почему не сканирует принтер canon mf4410

1 Karthik R [2015-09-08 07:14:00]

Я не совсем уверен, что вы пытаетесь сделать. Но для устранения ошибки я исправил суставной блок.

Следует отметить, что класс OrdArray не является массивом. Это класс, который имеет long[] a . Поэтому вам нужно получить массив, как и любое другое свойство объекта.

Для улучшения, пожалуйста, измените подпись метода следующим образом:

0 JumpMan [2015-09-08 09:36:00]

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

Удалить методы удаления, поиска и т.д., они не требуются.

Это мой код. Я вставил два целых массива (элементы) в inserta() и insertb(), отсортировал их и объединил с помощью метода insert(). Наконец, у меня есть отсортированный массив после их объединения. Смотрите мой код здесь:

Если вы согласитесь с списком решений, это будет:

Вы можете по желанию преобразовать его в массив с помощью

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

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

30 ответов

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

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

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

Следующая немного более сложная версия работает как с объектными, так и с примитивными массивами. Это делается путем использования 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):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание: сборщик необходим, потому что в Java это невозможно сделать

из-за стирания универсального типа:

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

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

Вот Это Да! Здесь много сложных ответов, в том числе простых, которые зависят от внешних зависимостей. как насчет этого:

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

Читайте также:  Почему ворд подчеркивает все слова красным

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

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

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

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

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

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

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

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

Но этот путь чреват зависимостями. После опыта разработки на android устройства я аккуратно стал относиться к зависимостям и стараюсь не использовать целую библиотеку ради одной функции. Но java очень мощный язык и мы можем написать свою функцию (метод) для объединения двух массивов в один в независимости от типа данных:

Следует обратить внимание, что массивы могут быть только с элементами, тип которых — потомок от типа Object. Впрочем, зачастую так и бывает. Можно расслабиться.
Если же все-таки случилось страшное, или же мы используем старый JDK, без поддержки произвольной типизации функций, то всегда можно переписать без дженериков:

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>