Примитивы бокса принесут вам 10-30-кратное снижение производительности. Поэтому, если вы действительно ограничены в производительности, вам захочется работать с необработанными примитивными массивами:
def arrayDistinctInts(someArray: Array[Int]) = {
java.util.Arrays.sort(someArray)
var overzero = 0
var ndiff = 0
var last = 0
var i = 0
while (i < someArray.length) {
if (someArray(i)<=0) overzero = i+1
else if (someArray(i)>last) {
last = someArray(i)
ndiff += 1
}
i += 1
}
val result = new Array[Int](ndiff)
var j = 0
i = overzero
last = 0
while (i < someArray.length) {
if (someArray(i) > last) {
result(j) = someArray(i)
last = someArray(i)
j += 1
}
i += 1
}
result
}
Вы можете стать немного лучше, чем это, если вы будете осторожны (и будьте осторожны, я набрал это на макушке; возможно, я что-то опечатал, но это стиль, который нужно использовать), но если вы найдете существующая версия слишком медленная, она должна быть как минимум в 5 раз быстрее и, возможно, намного больше.
Редактировать (в дополнение к исправлению предыдущего кода, чтобы он действительно работал):
Если вы настаиваете на том, чтобы заканчивать списком, то вы можете строить список по мере продвижения. Вы можете сделать это рекурсивно, но я не думаю, что в этом случае это будет яснее, чем итеративная версия, поэтому:
def listDistinctInts(someArray: Array[Int]): List[Int] = {
if (someArray.length == 0 || someArray(someArray.length-1) <= 0) List[Int]()
else {
java.util.Arrays.sort(someArray)
var last = someArray(someArray.length-1)
var list = last :: Nil
var i = someArray.length-2
while (i >= 0) {
if (someArray(i) < last) {
last = someArray(i)
if (last <= 0) return list;
list = last :: list
}
i -= 1
}
list
}
}
Кроме того, если вы не можете уничтожить исходный массив путем сортировки, то вам гораздо лучше, если вы продублируете массив и уничтожите копию (копии примитивов в массиве очень быстрые).
И имейте в виду, что существуют специальные решения, которые намного быстрее, но в зависимости от характера данных. Например, если вы знаете, что у вас длинный массив, но числа будут в небольшом диапазоне (например, от -100 до 100), то вы можете использовать набор битов, чтобы отслеживать, с какими вы столкнулись.