2016-11-05 4 views
0

Я пишу одну программу java, в которой я не хочу использовать какой-либо цикл для элементов списка массивов. Конечно, программа будет печатать выходные данные от 0 до n без использования какого-либо цикла, потому что ArrayList наследует метод toString() с петлей в нем из AbstractCollection.
Работа с элементами ArrayList без использования какого-либо цикла

import java.util.*; 
class withoutloop{ 
public static void main(String[] args){ 
    Scanner scan = new Scanner(System.in); 
    ArrayList<Integer> arr = new ArrayList<>(); 
    int n = scan.nextInt(); 
    for(int i=0;i<=n;i++) 
    arr.add(i); 
    System.out.println(arr); 
} 
} 

Но я хочу поставить некоторые вычисления, используя каждый элемент списка массива без какого-либо loop.Like программы ниже

import java.util.*; 
class withoutloop{ 
public static void main(String[] args){ 
    Scanner scan = new Scanner(System.in); 
    ArrayList<Integer> arr = new ArrayList<>(); 
    int n = scan.nextInt(); 
    int m = scan.nextInt(); 
    int count = 0; 
    for(int i=0;i<=n;i++) 
    arr.add(i); 
    for(int i=2;i<=m;i++){ 
    Iterator it = arr.iterator(); 
     while(it.hasNext()){ 
      Integer element = it.next(); 
      if(element%i==0) 
      count++; 
     } 
    } 
    System.out.println(count); 
} 
} 

Теперь, если я использую эту программу, это даст мне приблизительно O (n * m), которого я не хочу. Есть ли способ получить доступ ко всем элементам в списке массивов без использования какого-либо цикла?

+0

Что именно вы пытаетесь сделать? Похоже, ваш код указывает, являются ли какие-либо числа в '[0..N]' факторами любых чисел в '[2..M]' (который будет «истинным» для любых N и M обоих> = 2). – 4castle

+0

@ 4castle Yea и я имею эти числа от 0 до n в списке массивов. И я не хочу использовать другой цикл для списка массивов. –

+0

Что я говорю, ваша программа может быть сведена к 'System.out.println (n> = 2 && m> = 2);' – 4castle

ответ

1

Java 8 может сделать ваш код проще с помощью IntStream.rangeClosed, но вы можете сделать это, чтобы избежать решения O (n * m), не разрабатывая более разумный алгоритм.

long count = IntStream.rangeClosed(0, n) 
         .mapToLong(element -> IntStream.rangeClosed(2, m) 
          .filter(i -> element % i == 0) 
          .count()) 
         .sum(); 
System.out.println(count); 

Предыдущее в Java 8, эквивалентный код будет что-то вроде:

long count = 0; 
for (int element = 0; element <= n; element++) { 
    for (int i = 2; i <= m; i++) { 
     if (element % i == 0) { 
      count++; 
     } 
    } 
} 
System.out.println(count); 
Смежные вопросы