2016-11-23 13 views
9

Czy istnieje sposób na wyodrębnienie wspólnego wzorca na liście ciągów w Javie?Znajdowanie wzorca w zestawie wartości w Javie

Na przykład, jeśli mamy listę wartości:

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

Czy istnieje sposób, aby wywnioskować, że mamy 3digits, a następnie „-”, a następnie literę L i wreszcie o charakterze liczbowym?

Myślę, że ma to coś wspólnego z typowymi podciągami lub czymś podobnym, ale nie udało mi się jeszcze niczego znaleźć.

Dziękujemy!

EDYCJA: Oczywiście nie będzie to idealne uznanie, po prostu zwróci zalecenie na podstawie danych.

To, co próbuję zbudować, jest zbliżone do this. W filmie, gdy użytkownik klika kolumnę, istnieje zalecenie podzielenia danych na ":".

+0

wzór może być dowolny ???? –

+0

musisz wyodrębnić cyfry lub co? – skrtbhtngr

+4

* "dedukuj" *? Masz na myśli sztuczną inteligencję? – UnholySheep

Odpowiedz

4

Myślę, że możesz chcieć "wydedukować" wzorzec, który może mieć zestaw wspólnych ciągów znaków, i nie sprawdzać ich za pomocą wyrażenia regularnego. Ten problem może należeć do rozpoznawania wzorca.

  • Można zastosować Longest Common Substring (nie Najdłuższy wspólny podciąg) algorytm na każdym ze swoich dwóch ciągów, pierwszy. Zauważ, że zgodnie z twoją listą łańcuchów możesz otrzymać dwa najdłuższe wspólne podciągi: 00 i , więc musisz się tym zająć.
  • Następnie, gdy otrzymasz wspólny podciąg w wyniku, po prostu użyj metody contains(), aby sprawdzić wzór w innych ciągach.

Ta metoda działa dobrze tylko wtedy, gdy wspólny wzorzec między ciągami zawiera co najmniej kilka znaków.

EDIT:

Jeśli chcesz zaimplementować coś jak w danym filmie, wystarczy podzielić ciągi w oparciu o pewien ogranicznik. Łatwe i naiwne podejście:

  • Stwórz listę możliwych ograniczników, jak :, ., -, ,, :: itp
  • Szukaj wszystkich swoimi strunami dla wystąpienia pewnego ogranicznik. Algorytm LCS nie zadziałałby, ponieważ łańcuchy mogą mieć wspólne wartości danych (np. "Tak" i "Nie", jak w filmie wideo), które nie mają być ogranicznikiem.
  • split ciągi oparte na ograniczniku, jeśli występują we wszystkich (lub nawet w większości) ciągach!

Może być więcej optymalnych rozwiązań niż ten!

+0

Tak, to sposób na rozwiązanie tego problemu. To właśnie rozpoznawanie wzorca, którego szukam, ale nie udało mi się znaleźć niczego, co mogłoby mi pomóc. Dlaczego ta metoda działa najlepiej, jeśli ciąg ma co najmniej kilka znaków? Dla powyższego przykładu, nie możemy uzyskać -L dla wszystkich ciągów (zakładając, że wszystkie wartości są skonstruowane w ten sposób)? –

+1

Jeśli twój zestaw ciągów znaków ma tylko jeden znak, na przykład '-' jako wspólny wzór, algorytm LCS może mieć problem ze znalezieniem go, ponieważ' 00' zostanie wykryty jako pierwszy. '-L' działałoby dobrze, ale może być konieczne podanie algorytmu w postaci dwóch ciągów, takich jak' 012-L4' i '001-L5', dzięki czemu istnieje ** tylko jeden najdłuższy wspólny substring (' -L') . – skrtbhtngr

+0

Sprawdź moją zmianę w oryginalnym wpisie, może pokazać, co próbuję zrobić. I tak, oczywiście dane nie są ograniczone do 4 wartości powyżej, lista jest dłuższa, a następnie możemy znaleźć wzór -L. –

Powiązane problemy