2011-10-27 30 views
5

Sử dụng Java là cách tốt nhất để hợp nhất hai mảng của lớp dựa trên một số giá trị của lớp?Cách tốt nhất để hợp nhất hai Mảng lớp học dựa trên giá trị biến Class

Ví dụ, chúng tôi có hai lớp này:

public class C1{ 
    public String id=""; 
    public String value=""; 
    public String tot=""; 
} 

public Class C2{ 
public String id=""; 
public String tot=""; 
} 

Và trong một số điểm của mã của chúng tôi, chúng tôi có hai Mảng như:

  //id -value - tot 
C1 a [] = { {"1","value#1",""}, 
      {"2","value#2",""}, 
      {"3","value#3",""}, 
      {"4","value#4",""} 
    }; 
       //id - tot 
    C2 b [] = { {"1","2"}, 
       {"2","11"}, 
       {"4","15"} 
}; 

Mảng thức nên được như thế:

C1 f [] = { {"1","value#1","2"}, 
      {"2","value#2","11"}, 
      {"3","value#3",""}, 
      {"4","value#4","15"} 
}; 

Tôi đang cố gắng tìm ra cách tốt nhất để đạt được kết quả này mà không cần đọc một hoặc một mảng khác từ đầu đến cuối cùng, bởi vì ở đây hai mảng chỉ có vài hàng, nhưng trên thực tế chúng có thể có chiều dài 100k + ...

+2

Sắp xếp các mảng theo khóa. Đi qua các mảng bằng cách tăng khóa, so sánh để xem chúng có khớp hay không, và nếu sau đó chúng sử dụng sự phản chiếu để sao chép tất cả các thuộc tính của C2 đến C1. – bdares

+0

Trên bình luận là một giải pháp tốt đẹp nhưng tôi nghĩ rằng sự phản ánh là quá mức cần thiết trừ khi vì một lý do nào đó bạn không biết những trường nào cần phải được sao chép vào thời gian biên dịch. –

Trả lời

2

Đặt một mảng vào Map<String, C1> trong đó khóa là id. Lặp lại qua các mảng khác tìm kiếm id trong bản đồ và cập nhật giá trị. Nếu bạn sử dụng số TreeHashMap, bạn có thể lấy lại các giá trị theo thứ tự bằng các phím.

0

Điều này nghe như ví dụ về sách giáo khoa bạn đã phân phối với hadoop và map-reduce . Tùy thuộc vào mức độ tham vọng của bạn và ngân sách của bạn ở đây (và thời gian hoạt động này quan trọng đến mức nào) nó có thể đáng để xem xét.

0

Đây là một số công cụ cơ sở dữ liệu đang hoạt động để sinh sống. Hãy xem cách họ thực hiện: a) để tham gia tập dữ liệu rất nhỏ với các vòng lặp lồng nhau khác được sử dụng. Đó là cách hiệu quả nhất.
b) Nếu một bộ đủ nhỏ để vừa với bộ nhớ - bạn có thể đặt các cặp khóa-giá trị của nó trong hashmap và sau đó thực hiện một đường dẫn trên tập dữ liệu nhỏ hơn để tìm tất cả các kết quả phù hợp.
c) Nếu mảng được sắp xếp theo khóa - bạn có thể thực hiện sáp nhập sắp xếp hợp nhất. Bạn chỉ cần vượt qua cả hai tập dữ liệu và tìm kiếm các kết quả phù hợp. Nếu một mảng đã được sắp xếp - nó có thể có ý nghĩa để sắp xếp một mảng thứ hai và sau đó sử dụng thuật toán này.
d) Nếu cả hai tập dữ liệu quá lớn để vừa với bộ nhớ - bạn có thể sử dụng tham số băm grace. Bạn chia cả hai bộ dữ liệu thành các nhóm X bằng cách băm khóa nối của chúng. Nếu bạn sử dụng cùng hàm băm thì bạn có thể chắc chắn rằng bạn chỉ phải tham gia các nhóm tương ứng. Sau đó, bạn sử dụng bất kỳ kỹ thuật nào ở trên để tham gia nhóm.
e) Hadoop và Map/Reduce là tùy chọn tốt, nếu bạn có tập dữ liệu thực sự lớn. Bên trong nó sẽ sắp xếp cả hai tập dữ liệu và sau đó cho phép bạn làm việc tham gia.
f) Bạn có thể sử dụng Hadoop cùng với Hive, chỉ cần đặt dữ liệu vào bảng của nó và để cho nó tham gia. Tôi thấy tùy chọn này là thiết thực nhất cho khối lượng dữ liệu lớn.

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