Сравнение объекта в массиве со всем остальным в том же массиве - PullRequest
2 голосов
/ 03 марта 2011

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

for(int i=0; i<array1.size(); i++){
  for(int j=0; j<array1.size(); j++){
    if(i!=j){
      ..do stuff..
    }
  }
}

Ответы [ 4 ]

8 голосов
/ 03 марта 2011

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

for(int i=0; i<array1.size(); i++){
  for(int j=i + 1; j<array1.size(); j++){
     if(arr[i] != arr[j]){
        ..do stuff..
     }
  }
}

(Предполагается, что ваша идея равенства коммутативна , что обычно равенство.)

Если имеется N элементовв вашем массиве ваш исходный фрагмент будет выполнять N ^ 2 сравнений, тогда как мой фрагмент выполняет N (N-1) / 2 сравнений.

3 голосов
/ 03 марта 2011

При условии, что ваше отношение сравнения симметрично , вы можете покончить с

for(int i = 0; i < array1.size(); i++) {

    // Note the initial value of j
    for(int j = i + 1; j < array1.size(); j++) {
        if (i != j) {
            ..do stuff..
        }
    }
}

Альтернативный стиль (который удерживает отступы) - сделать

for(int i = 0; i < array1.size(); i++) {

    // Note the initial value of j
    for(int j = i + 1; j < array1.size(); j++) {
        if (i == j)
            continue;

        ..do stuff..
    }
}
1 голос
/ 03 марта 2011

Что касается скорости, вы можете просто зацикливаться до j < i вместо всего массива во внутреннем предложении, и это должно охватить вас.

например, если массив = [1,2,3,4], вы получите

  • Для 1: не сравнивать.
  • Для 2: сравните с 1.
  • Для 3: сравните с 1 2.
  • Для 4: сравните с 1 2 3.

Так что все сравниваются.

0 голосов
/ 03 марта 2011

Я не понимаю, почему это не сработает.

Хотя я всегда думал, что нужно вызывать .length для массивов (так как это поле, а не метод).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...