2016-10-09 2 views
2

Я хочу перебрать только половину массива в java. Есть ли элегантный способ сократить это, например, для каждого цикла?Есть ли способ сократить цикл for-each в java?

int[] array = {0,1,2,3,4,5}; 

for (int i = 0; i<array.length/2; i++) 
{ 
    System.out.println(array[i]); 
} 
+0

У вас проблемы с этим кодом? – f1sh

+1

нет, это прекрасно, просто пойдите с ним, но просто удалите '0 +' –

+5

Вы можете удалить часть '0 +' - она ​​ничего не добавит. – Mureinik

ответ

4

Если вы превратили массив в список с помощью asList метод Arrays класса в Java, то вы можете использовать метод forEach в List класса в Java, чтобы распечатать каждый элемент списка в одном линия,

Arrays.asList(array).forEach(System.out::println); 

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

Integer[] newArray = Arrays.copyOfRange(array, 0, array.length/2); 
Arrays.asList(newArray).forEach(System.out::println); 

EDIT: Как отметил Марко Топольник, мы фактически начинаем с массива примитивных типов вместо типов объектов, поэтому для использования метода asList нам придется преобразовать массив в массив объектов (от int до Integer с использованием Integer[] integerArray = ArrayUtils.toObject(array);). Однако это только кажется утомительным/неэффективным и OP попросил короткий путь так что мое предложение было бы использовать метод Марко,

Arrays.stream(array).limit(array.length/2).forEach(System.ou‌​t::println); 

EDIT 2: Как Янтарный Beriwal отметил, следует отметить, что, хотя один -линейное решение выше выглядит довольно из-за его краткости, оно все еще очень неэффективно/медленно по сравнению с оригинальным методом OP. Поэтому я хотел бы повторить комментарии Янтаря, что OP и другие должны просто придерживаться оригинального цикла for.

for (int i = 0; i < array.length/2; i++) 
{ 
    System.out.println(array[i]); 
} 
+0

@MarkoTopolnik моя ошибка lemme изменить мой ответ –

+0

На самом деле он напечатает что-то вроде '[ I @ 343af45; 'потому что это примитивный массив и будет преобразован в один элемент« Список ». –

+0

@MarkoTopolnik хороший catch! Я также исправлю это. –

1

Как насчет:

IntStream.range(0, array.length/2).map(i -> array[i]).forEach(System.out::println); 

Одна строка, и без каких-либо копий массива.

Сломался:

IntStream.range(0, array.length/2) //get the range of numbers 0 - (array length)/2 
     .map(i -> array[i])   //map from index to value 
     .forEach(System.out::println); //print result 
0

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

  1. алгоритма должны быть оптимальная
  2. время алгоритма, т.е. производительность должна быть оптимальной
  3. сложность алгоритма не должны быть слишком много. Для значительного прироста в 1 & 2 это можно пропустить.
  4. Учитывая 1 & 2, строки кода имеют как минимум приоритет.

Решение 1: Это решение будет в 4-5 раз медленнее, чем ваш подход, плюс Stream займет дополнительное пространство.

Arrays.stream(array).limit(array.length/2).forEach(System.ou‌​t::println); 

Решение 2: Это решение работает быстрее, чем выше кода и кода (на основе моего тестирования), но Stream займет дополнительное пространство. Кроме того, он не компактен.

Arrays.stream(array).limit(array.length/2).forEach(new IntConsumer() { 
    @Override 
    public void accept(int value) { 
     System.out.println(value); 
    } 
}); 

Решение 3: Как было предложено вам.

int[] array = new int[] { 0, 1, 2, 3, 4, 5 }; 
int limit = array.length/2; 
for (int i = 0; i < limit; i++) { 
    System.out.println(array[i]); 
} 

Рекомендация: Не ходи к сокращению LOC на костре потери производительности и памяти. Лучше не отставать от решения, которое дает вам лучшую производительность.

+0

Есть ли у вас какие-либо намеки на доказательство вашей квалификации «100-200 раз медленнее»? То же самое для «огромного требования к памяти»? –

+0

Ваше решение 2 - это не что иное, как решение 1 в расширенной форме. Здесь вы делаете еще более странные заявления о производительности.Вы действительно не должны заходить так далеко, делая абсолютно безосновательные претензии, не пытаясь их проверить. –

+0

Я просто использовал JMH для измерения производительности, во всех случаях это _identical_. –

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