2014-11-21 4 views
0

Я сделал этот метод, который сравнивает числа двух массивов и затем возвращает количество чисел, равных друг другу, но независимо от того, сколько чисел равно, метод возвращает значение 1 каждый раз. (оба массива одинаковой длины).Сравнение двух массивов. Неверное возвращаемое значение (1)

public static void main(String[] args) { 
    int a [] = {1, 4, 6, 7, 8, 10, 13}; 
    int b [] = {1, 2, 3, 4, 5, 6, 7}; 

    equal(a,b); 

} 


public static int equal(int[] a, int[] b){ 
    int j = 0; 
    for(int i = 0; i< a.length-1;i++){ 

     if(a[i] == b[i]){ 
      j++; 
     } 
    } 
    System.out.println(j); 
    return j; 
} 
+3

С этими массивами это абсолютно правильно. – splrs

ответ

2

Вы должны использовать цикл вложенных циклов, если вы хотите проверить, находится ли какое-либо число в массиве a в массиве b.

, например.

int numMatches = 0; 
for (int i = 0; i < a.length; ++i) 
{ 
    for (int j = 0; j < b.length; ++j) 
    { 
     if (a[i] == b[j]) 
      ++numMatches; //Naive, as obviously if the same number appears twice in a it'll get counted twice each time it appears in b. 
    } 
} 

Текущий код просто проверяет

т.е.
1 == 1 // Yes, increment j 
4 == 2 // Nope 
6 == 3 // Nope 
7 == 4 // Nope 
8 == 5 // Nope 
10 == 6 // Nope 
13 == 7 // Nope 
+0

Спасибо, это решило мою проблему – tomSurge

8

Ваш код нахождение числа, равные в том же индексе.

Существует несколько способов найти размер перекрестка.

Простая реализация O (m * n) будет состоять в том, чтобы перебирать все элементы b для каждого элемента a.

Если массивы отсортированы,, вы можете использовать отдельные индексы для двух массивов, продвигаясь вперед, когда они больше не могут совпадать. Это будет O (m + n). (Если они не отсортирован, вы можете отсортировать их первым, за счет вывода (лог т т + п § п).

Если каждый массив не имеет дубликатов пользователей, другой способ, чтобы вычислить размер от пересечения от размера заданной разности. Пример этого - http://ideone.com/6vLAfn. Ключевой частью является преобразование каждого массива в набор и определение количества членов, которые являются одним из элементов, удаляя один набор из другого.

int aSizeBefore = setA.size(); 
setA.removeAll(setB); 
int aSizeAfter = setA.size(); 
return aSizeBefore - aSizeAfter; 
2

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

public static int equal(int[] a, int[] b) { 
    int count = 0; 
    for(int i = 0; i < a.length - 1; i++) { 
     for(int j = 0; i < b.length - 1; j++) { 

      if (a[j] < b[j]) { 
       // we came to the part where all elements in b are bigger 
       // than our selected element in a 
       break; 
      } 
      else if (a[j] == b[j]) { 
       count++; 
      } 
     } 
    } 
    System.out.println(count); 
    return count; 
} 

Если вы не можете гарантировать, что массивы сортируются, можно удалить, если-блок и удалить еще-если это еще из цикла.

0

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

public static int equal(int[] a, int[] b) { 
     int j, result = 0; 
     int lastFound = 0; 
     for (int i = 0; i < a.length - 1; i++) { 
      for (j = lastFound; j < b.length; j++) { 
       if (a[i] == b[j]) { 
        result++; 
        lastFound = j; 
        break; 
       } else { 
        if (a[i] < b[j]) break; 
       } 
      } 
     } 
     return result; 

    } 

Использование переменной lastFound ускорит вашу петлю, но это полезно, только если массивы упорядочены, как указывает ваш пример.

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