2016-11-30 2 views
1

Я пытаюсь проверить, содержится ли элемент в моем массиве в одном из моих других массивов. Я не хочу использовать вложенный цикл для этого, и мне любопытно, почему мой .contains не работает.Попытка сравнить два массива с Arrays.contains Java

В настоящее время у меня есть два массива

double [] s2 = new double [4]; 
double [] match = new double [s2.length]; 

и я пытаюсь проверить, если s2 содержит любое из значений в моем match массиве

for (j = 0; j < s2.length; j++) 
     { 
      if(Arrays.asList(s2).contains(match[j])){ 
       return true; 
      } 
     } 

ли это что-то делать с двойным типом данных Я использую? Если это так, я могу использовать .contains?

+0

http://stackoverflow.com/a/30251235/1553851 – shmosel

+0

Любая конкретная причина вы дон Не хотите использовать вложенный цикл? – shmosel

+0

Вы * * используете вложенный цикл, вы просто косвенно используете 'contains' (и вы создаете новую оболочку списка для' s2' на каждом проходе). – chrylis

ответ

2

Решение конкретной проблемы: Arrays.asList не создает List ваших элементов, но List только одно значение: ваше double[] элементов (с индексом 0). Вы должны сами перебирать список за второй цикл for вместо создания другого объекта.


Это может быть сделано с Stream операций () вместо использования петель, хотя разница должна быть минимальной.

DoubleStream.of(s2)  // Pipe the source array 
    .distinct()   // Remove duplicate elements 
         // as they only need to be matched against once 
    .anyMatch(value -> // Consider if any value matches this condition 
     IntStream.of(match) // It equals any value in "match" 
       .distinct() // after removing duplicate elements 
       .anyMatch(matchValue -> matchValue == value)); 

Для получения дополнительной информации о потоках - см эти статьи Oracle: Обработка данных с Java SE 8 Streams Part 1, Part 2

1

Проблема Arrays.asList(s2) не возвращает объект List<Double>, как и следовало ожидать.

Он возвращает объект List<double[]>. Таким образом, элементы внутри этого массива будут иметь тип double[].

Дженерики не работают с примитивными типами.

Решение должно преобразовывать double[] в Double[].

+0

В качестве решения пользователь должен использовать 'Массивы. какList'. – Unihedron

+0

@Unihedron Не работает. asList не будет принимать 'double []' таким образом. Ошибка компиляции :) – Thihara

+0

А, вы правы, я ошибся, думая, что параметр будет адаптироваться. Виноват! – Unihedron