2016-12-05 6 views
2

Я пытаюсь определить, являются ли числа в списке массивов делящимися на все числа в antoher arraylist. Мой код ниже выводит все номера из списка listdiv, которые могут быть деактивированы любыми делителями в listdivisor. Я хотел бы выводить значения, которые делятся на все деления в списке, а не на любые из них. Например, если у меня есть listdiv = [1,2,3,, 5,8] и listdivisor = [2,4]. ожидаемый выход должен быть 8, но этот код выводит 2 и 8.Как определить числа в списке массивов, если они делятся на числа в другом списке массивов?

Спасибо! Ваше усилие будет принята с благодарностью!

for (int i = 0; i < listdiv.size(); i++) { 
      for (int c = 0; c < listdivisor.size(); c++) { 
       if (listdiv.get(i) % listdivisor.get(c) == 0) { 
       System.out.println("final results are : " + listdiv.get(i)); 
       } 
      } 
     } 

ответ

2

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

System.out.println("final results are: "); 

for (int i=0; i < listdiv.size(); i++) { 
    boolean isDivisible = true; 
    for (int c=0; c < listdivisor.size(); c++) { 
     if (listdiv.get(i) % listdivisor.get(c) != 0) { 
      isDivisible = false; 
      break; 
     } 
    } 

    if (isDivisible) { 
     System.out.println(listdiv.get(i)); 
    } 
} 
2

Ваше условие проверяет значения, делящиеся хотя бы на один делитель, который не то, что вы хотите.

Вы должны проверить все делители перед генерацией вывода:

for (int i = 0; i < listdiv.size(); i++) { 
    boolean divisible = true; 
    for (int c = 0; c < listdivisor.size() && divisible; c++) { 
     if (listdiv.get(i) % listdivisor.get(c) != 0) { 
      divisible = false; 
     } 
    } 
    if (divisible) { 
     System.out.println("final results are : " + listdiv.get(i)); 
    } 
} 
+0

Спасибо, ваш код работает хорошо, но я можно отметить только один человек! – Snailwalker

2

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

outer: 
for (int i = 0; i < listdiv.size(); i++) { 
    for (int c = 0; c < listdivisor.size(); c++) { 
     if (listdiv.get(i) % listdivisor.get(c) != 0) { 
      continue outer; 
     } 
    } 
    System.out.println("Found : " + listdiv.get(i)); 
} 

Это решение не требует каких-либо дополнительных переменных (например, логическое значение, чтобы сохранить статус делимости) и использует менее известный loop labels

+0

Спасибо, ваш код работает так же хорошо, но я могу отметить только один asnwer! – Snailwalker

3

Другой путь с Явы 8:

List<Integer> collect = listdiv.stream().filter(p -> 
     listdivisor.stream().allMatch(d -> p % d == 0) 
).collect(Collectors.toList()); 

Или более высокие показатели с parallelStream():

List<Integer> collect = listdiv.parallelStream().filter(p -> 
     listdivisor.parallelStream().allMatch(d -> p % d == 0) 
).collect(Collectors.toList()); 
+0

Параллель на самом деле будет * медленнее *, когда входные списки будут такими маленькими. Тем не менее, upvote для решения Java 8 stream. – Andreas

+0

Да, Параллельно зависит от чего-то, чтобы хорошо работать – Jerry06

2

Все представленные алгоритмы O (N * M). Можно получить O (N + M), сначала найдя LCM первого списка и используя его для фильтрации второго списка.

int thelcm = 1 
for(int i : listdivisor) { 
    thelcm = lcm(thelcm, i); 
} 

ArrayList<Integer> result = new ArrayList<>(); 
for(int j : listdiv) { 
    if(j % thelcm == 0) { 
    result.put(j); 
    } 
} 
0

Мы можем использовать набор для получения ожидаемого результата, я изменил код,

Set<Integer> firstIteration = new HashSet<>(); 
     Set<Integer> nextIteration = new HashSet<>(); 
     for (int c = 0; c < divisors.size(); c++) { 
      for (int i = 0; i < numbers.size(); i++) { 
       if (numbers.get(i) % divisors.get(c) == 0) { 
        if (c == 0) { 
         firstIteration.add(numbers.get(i)); 
        } else { 
         nextIteration.add(numbers.get(i)); 
        } 
       } 

      } 
      if (c != 0) { 
       // We will perform Set intersection here for each iteration 
       firstIteration.retainAll(nextIteration); 
      } 
     } 
     System.out.println(firstIteration); 

Надеется, что это позволит решить проблему

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