2013-03-09 2 views
0

У меня есть массив int, размер 8. Я хочу сделать поиск по array для пар (например, если число по индексу 0 совпадает с номером по индексу 5).Поиск в массиве для пар

Я попытался сделать два массива (второй экземпляр был первым), но это не имело смысла, потому что все будет в парах.

Затем я попытался сделать половину массива, поэтому я сделал два arrays размером 4 и сравнил их. Это не решило, что пары могут быть в одном массиве.

Для заполнения array Я пользуюсь случайными числами, максимальное значение случайного числа - array(8).

+1

Неясно, будете ли вы после определенных совпадений (в этом случае я ожидал бы индекс 5, а не 4) или просто * любые * дубликаты. –

ответ

0

Если у вас небольшое максимальное значение, вы можете инициализировать бит массива этой длины. Пройдите через исходный массив и установите соответствующий бит для каждого члена. Если бит-бит в этом положении равен true, у вас есть пара. Если вам нужна определенная позиция, используйте массив int.
попробовать что-то вроде этого:

BitArray bucket = new BitArray(<<your max value>>); 
foreach(int i in originalArray) 
{ 
if(bucket[i]) return true; 
bucket[i] = true; 
} 
1

Вы можете использовать LINQ.

int[] array = new[] { 1, 2, 3, 1, 4, 5, 6, 7, 8, 8 }; 
var duplicates = array 
    .GroupBy(i => i) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key); 
foreach (var d in duplicates) 
    Console.WriteLine(d); 
0

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

int[] items = new[] { 1, 2, 3, 1, 4, 5, 3, 7 }; 

var duplicates = items.Select((e, i) => new { e, i }) 
         .GroupBy(i => i.e) 
         .Where(g => g.Count() > 1) 
         .Select(g => new { Value = g.Key, Indexes = g.Select(e => e.i).ToList() }) 
         .ToList(); 

duplicates содержит 2 элементы, с следующим содержанием:

enter image description here

0

Вы можете создать словарь (как Dict [я] ==> А.Р. луч индексов)

var dubs = array.Select((i, inx) => new { i, inx }) 
      .GroupBy(x => x.i) 
      .ToDictionary(g => g.Key, g => g.Select(y => y.inx).ToList()); 
0

Традиционный способ найти пар для сортировки массива (метод А, ниже). Другой способ состоит в том, чтобы иметь две вложенные петли (метод B).

Tell("Method A..."); 
int[] a = new int[]{3, 1, 4, 1, 5, 9, 5, 5}; 
int lengthA = a.Length; 
Array.Sort(a); 
for (int i = 1; i < lengthA; i++) 
{ 
    if (a[i-1] == a[i]) 
    { 
    Tell("Method A Found pair in a: "+a[i-1]+" and "+a[i]); 
    } 
} // for i 

Tell("Method B..."); 
int[] b = new int[]{3, 1, 4, 1, 5, 9, 5, 5}; 
int lengthB = b.Length; 
for (int i = 0; i < lengthB-1; i++) 
{ 
    for (int j = i+1; j < lengthB; j++) 
    { 
    if (b[i] == b[j]) 
    { 
     Tell("Method B Found a pair in b: "+b[i]+" and "+b[j]); 
    } 
    } // for j 
} // for i 

Вот выход ...

  • Метод A ...
  • Метод А Найдено пара в: 1 и 1
  • Метод A Найдено пара в: 5 и 5
  • Метод A Найдено пара в: 5 и 5
  • Способ B ...
  • Метод B Найдено пару в б : 1 и 1
  • Метод B Найдена пара в б: 5 и 5
  • Метода B Найдена пара в б: 5 и 5
  • Метода B Найдена пара в б: 5 и 5

Надеюсь, вы увидите, почему метод B сообщает больше пар, чем метод A.

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