2010-06-01 72 views
7

Tôi có hai danh sách số nguyên (List<int>). Chúng chứa các yếu tố tương tự, nhưng Danh sách 1 chứa các yếu tố không có trong danh sách 2.Tìm các phần tử "không giống nhau" trong hai mảng

Làm thế nào để tìm thấy trong đó yếu tố của danh sách 1 KHÔNG trong Danh 2.

Cảm ơn :)

PS. lang là C#

Trả lời

3
new HashSet<int>(l1).ExceptWith(l2); 
-1

Nếu chúng không được sắp xếp hoặc gì đó, bạn sẽ gặp khó khăn.

Thuật toán O (N^2) (vòng lặp đơn giản, ngu ngốc) hoặc cấu trúc dữ liệu bổ sung, cho tôi biết bạn thích loại nào hơn.

Hoặc, tất nhiên bạn có thể thay đổi dữ liệu nguồn bằng cách sắp xếp, mà tôi cho rằng không phải là một tùy chọn.

+1

Bằng cách nào, sắp xếp chúng trong O (N log N) không phải là một khả năng? – Pieter

+0

Bạn cũng có thể sắp xếp cả hai danh sách O (kN) và tính toán sự khác biệt O (N). – kennytm

18

Bạn có thể sử dụng IEnumerable.Except:

list1.Except(list2); 
+0

+1. Bạn đã đánh tôi với nó. – brickner

+0

không thể thực hiện theo cách này vì đối số của Ngoại lệ phải là IEnumerable. Danh sách như một đối số là không thể chấp nhận. – trnTash

+3

@trnTash: Danh sách triển khai IEnumerable . Mã là chính xác. – dtb

0

Để đơn giản bạn có thể sử dụng phương pháp chứa và kiểm tra một danh sách không chứa một phần tử của người kia:

for (int i = 0; i < list2.Count; ++i) 
{ 
    if (!list1.Contains(list2[i]) //current element is not in list 1 
     //some code 
} 
+0

Đây là số lùi và thuật toán O (N^2). –

+0

điều này cũng có thể thực hiện nhưng giải pháp khác nhanh hơn và ít mã hơn. – trnTash

1

Một rất dễ dàng giải pháp:

HashSet<int> theSet1 = new HashSet<int>(List1); 
theSet1.ExceptWith(List2); 
+0

HashSet giúp sau khi tất cả. Cảm ơn! – trnTash

+5

Bạn đang cảm ơn chính mình vì câu trả lời của riêng bạn? –

+2

Không. Để người đã xóa bài đăng của mình. – trnTash

0

Nếu giải pháp của bạn là danh sách linh sam chứa thứ hai và để bạn săn hồ sơ onli thêm vào sau khi danh sách đầu tiên, Có lẽ đây sẽ là hữu ích

public static int DokleSuIsti(IList<string> prevzemNow, IList<string> prevzemOld) 
     { 
      int dobroja = 0; 
      int kolikohinaje; 
      if (prevzemOld.Count() < prevzemNow.Count()) 
      { 
       kolikohinaje = prevzemOld.Count(); 
      } 
      else 
      { 
       kolikohinaje = prevzemNow.Count(); 
      } 



      for (int i = 0; i < kolikohinaje; i++) 
      { 
       if (!Object.Equals(prevzemNow[i], prevzemOld[i])) 
       { 
        dobroja = i; 
        return dobroja; 
       } 
       dobroja = i; 
      } 
      return dobroja; 
     } 

Sau đó bạn có thể sử dụng int như điểm khởi đầu cho máng đi bộ của bạn Ilist

Các vấn đề liên quan