2011-11-19 10 views
5

Próbuję napisać metodę, która zwróci mi kod odpowiadający produktowi bankowemu, który muszę przekazać do usługi sieciowej. Mam szereg kwalifikujących się typów produktów generycznych, a dane wejściowe będą ciągami, które będą specyficznym typem dowolnego z typów ogólnych w tablicy. Pozwól mi wyjaśnić to za pomocą kodu, który już posiadam:Maksymalna zgodność dla ciągu znaków

public static void main(String[] args) 
{ 
    String[] names = { "Checking", "Savings", "DEMAT", "DEMAT Savings", "Interest Checking" }; 
    String input = "Employee Checking"; 
    int min = Integer.MAX_VALUE; 
    String maxMatch = null; 
    for(String name : names) 
    { 
     int i = input.indexOf(name); 
     if(i > -1 && i < min) 
     { 
     min = i; 
     maxMatch = name; 
     } 
    } 
    if(null != maxMatch) 
    { 
     System.out.println("Maximum match for " + input + " found at " + maxMatch); 
    } 
} 

Powyższy fragment próbuje wykonać maksymalne dopasowanie dla danych wejściowych. Tak więc, jeśli jako dane wejściowe mam "Sprawdzanie zainteresowania pracowniczego", dopasowuję się do "Sprawdzania zainteresowania", a nie tylko "Sprawdzania".

Co chcę wiedzieć, czy istnieje sposób na dalszą optymalizację tego fragmentu kodu lub czy są przypadki, w których ten kod się nie powiedzie?

+0

Jeżeli możliwość dopasowania w nazwach [] kazano o długości, na przykład "Sprawdzanie odsetek" było wcześniejsze niż "Sprawdzanie", nie trzeba było porównywać do min. Dłuższe mecze odbyłyby się automatycznie w pierwszej kolejności. – user949300

Odpowiedz

3

Jeśli trzymać posortowaną tablicę o długości łańcucha, można mieć pewność, że pierwszy mecz dałoby max mecz

import java.util.Arrays; 
import java.util.Comparator; 

public class MaxIndex { 

private static String[] names = { "Checking", "Savings", "DEMAT", "DEMAT Savings", 
     "Interest Checking","Savings Interest Checking","My Employee Savings Interest Checking" }; 

public static void main(String[] args) { 

    Arrays.sort(names, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      Integer L1 = o1.length(); 
      return L1.compareTo(o2.length())*-1; 
     } 
    }); 

    findMaxMatch("Employee Checking"); 
    findMaxMatch("Employee Savings"); 
    findMaxMatch("Employee Interest Checking"); 
    findMaxMatch("Employee Savings Interest Checking"); 
    findMaxMatch("My Employee Savings Interest Checking"); 
    findMaxMatch("Employee Current"); 
} 

private static void findMaxMatch(String input) { 
    String maxMatch = maxMatch(input); 
    if (null != maxMatch) { 
     System.out.println("Maximum match for '" + input + "' found at '" 
       + maxMatch+"'"); 
    }else{ 
     System.out.println("No match for '"+input+"'"); 
    } 
} 

private static String maxMatch(String input) { 
    for (String name : names) { 
     int i = input.indexOf(name); 
     if (i > -1) { 
      return name; 
     } 
    } 
    return null; 
} 

}

Output

Maximum match for 'Employee Checking' found at 'Checking' 
Maximum match for 'Employee Savings' found at 'Savings' 
Maximum match for 'Employee Interest Checking' found at 'Interest Checking' 
Maximum match for 'Employee Savings Interest Checking' found at 'Savings Interest Checking' 
Maximum match for 'My Employee Savings Interest Checking' found at 'My Employee Savings Interest Checking' 
No match for 'Employee Current' 
+0

Myślałem o sortowaniu tablicy, ale nie sortowałbym się nad głową? – Vrushank

+0

Może to być narzut, jeśli posortujesz go za każdym razem, gdy znajdziesz dopasowanie, ale jeśli posortujesz go raz i odwołasz się do posortowanej tablicy, to tak nie jest. –

0

Nie powiedzie się, jeśli dopasowanie max nie było w pierwszej części łańcucha. Jeśli na przykład Twój wpis to Interest Checking For Employees, to będzie on pasował do Checking zamiast do Interest Checking. Czy dopasowanie max ma znaleźć konto z najbardziej sekwencyjnymi znakami, które pasują do siebie? Lub po prostu dopasowanie najbliższe końca wejścia?

-2

użycie tego celu znalezienia ostatnią pozycję

names.lastIndexOf(input) 

na podstawie położenia tablicy, uzyskać wartość

2

Jeśli dobrze rozumiem pytanie chcesz znaleźć najdłuższy mecz w przypadku istnieje kilka meczów. Jednym ze sposobów na to byłoby sortowanie "nazw" w porządku malejącym (w oparciu o ich długość) i zatrzymanie się w pierwszym meczu.

Można to zrobić za pomocą SortedMap < Integer, String>, w którym chcesz umieścić długość każdego „name” ze swoimi „nazwa” jako swój klucz.

Na przykład robiąc coś takiego:

SortedMap<Integer,String> map = new TreeMap<Integer, String>(new Comparator<Integer>() { 
    public int compare(Integer o1, Integer o2) { 
     return -o1.compareTo(o2); 
    } 
}); 
for (final String name: names) { 
    map.put(name.length(),name); 
} 

Następnie iteracyjne i zatrzymać jak najszybciej znaleźć się pierwszy mecz.

To trochę "przesada", ale działa.

0

Jeśli rozumiem poprawnie, znaleziony ciąg powinien być zawsze podciąganym zapytaniem?

Użyj , aby znaleźć podłańcuch, a jeśli go znajdziesz, zatrzymaj go, jeśli jest najdłuższy.

public static void main(String[] args) 
{ 
    String[] names = {"Checking", "Savings", "DEMAT", "DEMAT Savings", "Interest Checking"}; 
    String input = "Employee Interest Checking"; 
    int min = Integer.MIN_VALUE; 
    String maxMatch = null; 
    for (String name : names) 
    { 
     boolean has = input.contains(name); 
     if (has && min < name.length()) 
     { 
      min = name.length(); 
      maxMatch = name; 
     } 
    } 
    if (null != maxMatch) 
    { 
     System.out.println("Maximum match for " + input + " found at " + maxMatch); 
    } 
} 

i podobnie jak użytkownik988052 powiedział; jeśli zamówisz tablicę we właściwy sposób, możesz zatrzymać się w pierwszym meczu, więc nie musisz już więcej szukać i możesz wyeliminować min.

Uporządkowanie tablicy zstępującego o długości:

Arrays.sort(names, new Comparator<String>() 
    { 
     public int compare(String o1, String o2) 
     { 
      int d = o2.length() - o1.length(); 
      return d != 0? d : ((Comparable<String>)o1).compareTo(o2); 
     } 
    }); 
Powiązane problemy