Nhờ mọi người trợ giúp giải đáp vấn đề với việc tìm kiếm

Xin chào mọi người, mình gà và mình đang gặp bài toán này hơi bí rất mong được mọi người trợ giúp. Mình đang có một cây với cấu trúc như sau:


-|NhaXuanBan
–|ChuDe
—|LoaiBai
----|BaiViet


Trong đó, các class được tổ chức theo dạng cứ là parent sẽ lưu id các child trong list đặt tên là children như sau:

Class NhaXuanBan:

  • IDNhaXuanBan
  • chirldren: [luat:102, doisong:103]
    ** chirldren là danh sách định danh các loại chủ đề lưu theo dạng string “ten:ID”
  • …các thuộc tính khác

ChuDe: là một mảng tự động sinh ra trên UI, tự động gom nhóm loại bài viết theo một thuật toán gì đó, tương tự class NhaXuatBan cũng có mảng chirldren là danh sách định danh các loại chủ đề.

Class LoaiBai:

  • IDLoaiBai
  • chirldren: [luat:102:luat113, luat:102:luat114, doisong:103:ds236, doisong:103:ds113]
    **chirldren là danh sách định danh các bài viết lưu theo dạng string theo format
    “tenLoaiBai:IDLoaiBai:IdBaiViet”
  • …các thuộc tính khác

Class BaiViet:
-IDBaiViet // lưu theo dạng string với format “tenLoaiBai:IDLoaiBai:IdBaiViet”
…các thuộc tính khác

Vấn đề đặt ra ở đây là so sánh giống nhau (==) các đối tượng trên.

  • Với BaiViet thì đơn giản vì nó là object nên mình chỉ cần so sánh 2 object (BaiVietA===BaiVietB) với nhau là xong.
  • Với LoaiBaiViet thì mình dùng vòng lặp, lặp qua mảng children sẽ có các ID của bài viết, nhờ đó dựa vào ID lấy value của bài viết ra để so sánh.
function SomeFunction( LoaiBaiVietA, LoaiBaiVietB )

for ( let IDBaiVietA of LoaiBaiVietA.chirldren) {
     let Flag  = false;
     for ( let IDBaiVietB of LoaiBaiVietB.chirldren) {
         if ( LayBaiVietTheoID(IDBaiVietA) === LayBaiVietTheoID(IDBaiVietA) ) {
            Flag = true;
            break;
         }
  }
  if(Flag){
     break;
  }
}
if(Flag){
//Do something here
//Do something here
//Do something here
}

Mới tới đây mình đã phải dùng 2 vòng lặp lồng nhau rồi, còn so sánh chủ đề, nhà xuất bản nữa mình phải lồng thêm vòng lặp vô thì thấy không ổn một chút nào, nhất là khi xử lý cơ sở dữ liệu lớn thì càng không được, rất mong được mọi người giúp đỡ cho hướng giải quyết. Mình xin trân trọng cảm ơn.

Cấu trúc dữ liệu hơi kỳ nhỉ, lưu bài viết rồi many to many đến mấy loại kia thôi chứ nhỉ, server chả lẻ lại lưu dạng tree view

3 Likes

À không bác, bài toán thôi bác, em ví dụ thôi à.

Mỗi BaiViet, LoaiBai đều có id đó, sao không kiểm tra bằng id thôi là được

Không hiểu yêu cầu chức năng của bạn là gì mà phải kiểm tra 2 đối tượng bằng nhau?
Liệu flow xử lý mà bạn vạch ra có đang thực sự tốt?

3 Likes

Cấu trúc dữ liệu nhầm lẫn rồi nhé. Tổ chức category thì table child lưu id của parents hoặc thực ra là mấy cái này nằm chung một table, căn cứ vào id để biết thằng nào là cha/ con bằng cách nhìn vào id.

Không nên làm ngược lại theo cách thằng cha lưu ID thằng con vì thằng con là không xác định trước và tạo ra bất cứ lúc nào, hổng lẽ mỗi lần xóa/ thêm thằng con lại đi tìm thằng cha để cập nhật.

Nếu thích nghiên cứu giải thuật cho rốt ráo vấn đề, dùng https://en.wikipedia.org/wiki/Depth-first_search

4 Likes

Cảm ơn bạn. Đây là flow cũ, mình chỉ thêm tính năng copy thôi, không được động gì vô nữa cả.

Bạn nói rất đúng. Nhưng do đây là project của người khác đã nhiều lần sửa xoá thay đổi quá nên nó tè le vậy đó, nhưng cái đó mình mặc thôi vì là của người ta, mình chỉ thêm cái tính năng copy - paste thôi à. khi copy-paste thì bỏ qua những cái trùng nên mìn mới phải tìm kiếm để xác định có trùng hay không thui ấy mà. Cảm ơn bạn đã cho mình link xanh, mình sẽ tham khảo.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?