2016-11-23 21 views
9

Có cách nào để trích xuất một mẫu chung trong danh sách các chuỗi trong Java không?Tìm mẫu trong một tập các giá trị trong Java

Ví dụ, nếu chúng ta có một danh sách các giá trị:

001-L1 
002-L2 
003-L3 
004-L4 
... 

Có cách nào để suy luận rằng chúng ta có 3digits, tiếp theo là '-', sau đó một chữ cái L và cuối cùng là một nhân vật số?

Tôi nghĩ rằng nó có liên quan đến các chất nền thông thường hoặc thứ gì đó tương tự nhưng tôi chưa thể tìm thấy bất kỳ thứ gì.

Cảm ơn bạn!

EDIT: Rõ ràng đây không phải là sự công nhận hoàn hảo, nó sẽ chỉ trả lại đề xuất dựa trên dữ liệu.

Những gì tôi đang cố gắng xây dựng là một cái gì đó gần với this. Trong video, khi người dùng nhấp vào cột, có đề xuất chia dữ liệu trên ":".

+0

mẫu có thể là bất cứ thứ gì ???? –

+0

bạn cần trích xuất các chữ số hoặc cái gì? – skrtbhtngr

+4

* "suy luận" *? Bạn có nghĩa là giống như một trí thông minh nhân tạo? – UnholySheep

Trả lời

4

Tôi nghĩ bạn có thể muốn "suy ra" mẫu có thể có chung một chuỗi và không xác thực chúng bằng regex. Vấn đề này có thể thuộc về nhận dạng mẫu.

  • Bạn có thể áp dụng thuật toán Longest Common Substring (không phải dài nhất tiếp theo) trên bất kỳ hai chuỗi nào của bạn, trước tiên. Lưu ý rằng theo danh sách các chuỗi của bạn, bạn có thể nhận được hai đoạn mã phổ biến dài nhất 00-L, vì vậy bạn cần phải chăm sóc nó.
  • Sau đó, khi bạn nhận được một chuỗi con chung, bạn chỉ cần sử dụng phương thức contains() để kiểm tra mẫu trong các chuỗi khác.

Phương pháp này chỉ hoạt động tốt khi mẫu chung giữa các chuỗi ít nhất một vài ký tự.

EDIT:

Nếu bạn muốn thực hiện một cái gì đó giống như trong đoạn video nào đó, bạn chỉ cần để phân chia các chuỗi dựa trên một delimiter nhất định. Một cách tiếp cận dễ dàng và ngây thơ:

  • Tạo một danh sách các delimiters có thể, như :, ., -, ,, ::, vv
  • Tìm kiếm tất cả dây của bạn cho sự xuất hiện của một dấu phân cách nhất định. Thuật toán LCS sẽ không hoạt động vì các chuỗi có thể có các giá trị dữ liệu chung (như "Có" và "Không" như trong video) mà không có ý định là dấu phân cách.
  • split các chuỗi dựa trên dấu tách, nếu nó được tìm thấy trong tất cả (hoặc thậm chí nhất) của các chuỗi!

Có thể có nhiều giải pháp tối ưu hơn giải pháp này!

+0

Vâng đó là một cách để giải quyết vấn đề. Đó chính xác là nhận dạng mẫu mà tôi đang tìm kiếm, nhưng tôi không thể tìm thấy bất kỳ thứ gì có thể giúp tôi. Tại sao phương pháp này hoạt động tốt nhất nếu chuỗi có ít nhất một vài ký tự? Đối với ví dụ trên, chúng ta không thể lấy -L cho tất cả các chuỗi (giả sử tất cả các giá trị được xây dựng theo cách này)? –

+1

Nếu bộ chuỗi của bạn chỉ có một ký tự, như '-' làm mẫu chung, thuật toán LCS có thể gặp khó khăn khi tìm kiếm nó vì' 00' sẽ được phát hiện trước tiên. '-L' sẽ hoạt động tốt nhưng bạn có thể phải đưa đầu vào cho thuật toán hai chuỗi như' 012-L4' và '001-L5' để có ** chỉ ** một chuỗi con dài nhất (' -L') . – skrtbhtngr

+0

Kiểm tra chỉnh sửa của tôi trong bài đăng gốc, nó có thể hiển thị những gì tôi đang cố gắng làm. Và có, tất nhiên dữ liệu không bị giới hạn ở 4 giá trị trên, danh sách dài hơn và sau đó chúng ta có thể tìm thấy mẫu -L. –

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