2013-07-01 3 views
5

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

Вот моя попытка:

public static <T> T[] sumArrays(T[] lhs, T[] rhs) 
    { 
     T[] out = new T[Math.max(lhs.length, rhs.length)]; 

     for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){    
      if (i < Math.min(lhs.length, rhs.length)){ 
       out[i] = lhs[i] + rhs[i];     
      } else if (i < lhs.length){ 
       out[i] = lhs[i]; 
      } else /* if (i < rhs.length)*/{ 
       out[i] = rhs[i]; 
      }    
     } 
     return out;   
    } 

Но у меня есть несколько замечаний несмотря на то ошибки компиляции.

  1. Почему эта функция не существует в библиотеке Java, которая чрезвычайно велика?

  2. Мне было мотивировано использовать дженерики, так как вы использовали бы шаблоны в C++.

  3. Я беспокоюсь о получении глубоких копий входных данных; lhs и `` rhs. Может ли кто-нибудь успокоить меня по этому поводу? C++ позволяет мне передавать постоянную ссылку; и я точно знаю.

  4. Мгновенное включение T[] out представляется незаконным с использованием типового типа. Что мне не хватает?

  5. Будет ли компилятор оптимизировать мой повторный Math.max(lhs.length, rhs.length)?

  6. Компилятор не любит lhs[i] + rhs[i]. Предположительно, потому что он не знает тип T, но C++ позволяет это сделать, поскольку он не будет пытаться скомпилировать шаблон до тех пор, пока он не узнает тип.

6) Собираетесь ли вы получить глубокую копию при возвращении? Опять же, компиляторы C++ не берут дополнительную копию.

Может быть, я слишком стар, чтобы привыкнуть к Java ;-)

+0

Ad 3) http://javadude.com/articles/passbyvalue.htm –

+0

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

+1

'T' неизвестно во время выполнения поэтому вы не можете делать 'new T []' – blank

ответ

8

0) Почему не эта функция чрезвычайно гигантской библиотеки Java?

Запрашивайте мнение, не относящееся к теме здесь.

2) Я беспокоюсь о получении глубоких копий входных данных; lhs и rhs. Может ли кто-нибудь успокоить меня по этому поводу? C++ позволяет мне передавать постоянную ссылку; и я точно знаю.

6) Собираетесь ли вы получить глубокую копию при возвращении? Опять же, компиляторы C++ не берут дополнительную копию.

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

3) Создание объектов T[] представляется незаконным с использованием типового типа. Что мне не хватает?

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

4) Будет ли компилятор оптимизировать мой повторный Math.max(lhs.length, rhs.length)?

Некоторые JIT могут быть, но вы не можете получить какие-либо гарантии. Извлеките локальную переменную.

5) Компилятор не любит lhs[i] + rhs[i]. Предположительно, потому что он не знает тип T, но C++ позволяет это сделать, поскольку он не будет пытаться скомпилировать шаблон до тех пор, пока он не узнает тип.

К сожалению, у вас здесь много неприятностей. Невозможно генерировать алгоритмы для всех примитивных типов Java.

+0

Hum, но +1. Это не следует рассматривать как критику, поскольку Java обязана своей элегантностью при рассмотрении вопроса о том, как улучшить другие языки, но все это было бы легко достигнуто на C++ с использованием шаблонов. Думаю, я должен построить версию, используя double вместо T. – Bathsheba

+0

@Bathsheba В C++, что произойдет, если вы попытаетесь (например) добавить баскетбол в баскетбол? Как написано, ваш код позволяет это (если компилятор не возражал) –

+2

Шаблоны C++ создаются при компиляции с определенными типами, поэтому они имеют мало общего с Java Generics. Да, JG - довольно хромающая особенность Java, с ужасным отношением толчка к весу и уже получила много критики в этом отношении. –

1

5) Компилятор не любит lhs [i] + rhs [i]. Предположительно, потому что он не знает тип T, но C++ позволяет это сделать так, как это будет не пытаться скомпилировать шаблон, пока он не знает тип.

Вы всегда можете написать интерфейс с функцией .add (...) и позволить T расширять этот интерфейс. Тогда вы можете написать lhs [i] .add (rhs [i])

Смежные вопросы