2011-11-19 9 views
5

Webサービスに渡す必要のある銀行商品に対応するコードを返すメソッドを作成しようとしています。私は適格な配列タイプの製品を持っていて、入力は配列のジェネリックタイプの特定のタイプになる文字列になります。文字列の最大一致数

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); 
    } 
} 

上記のスニペットは、入力に対して最大の一致を実行しようとしています。だから私が "従業員の利子のチェック"を入力した場合、私は "チェック"だけでなく "利息のチェック"でマッチを得る。

私が知りたいことは、このスニペットをさらに最適化する方法があるかどうか、またはこのコードが失敗する場合があるかどうかです。

+0

名に一致する可能性は、[]例えば、長さ順に並べた場合"Interest Checking"は "Checking"の前に来たので、minと比較する必要はありません。より長いマッチが自動的に最初に起こります。 – user949300

答えて

3

、あなたは最初の試合は、最大一致

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; 
} 

}

出力を与えることを確認することができます

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

私は配列をソートすると思ったが、それ自体をソートしないのはオーバーヘッドですか? – Vrushank

+0

一致するたびに並べ替えるとオーバーヘッドになることがありますが、一度並べ替えて並べ替えられた配列を参照すると、一致しない場合があります。 –

0

最大一致が文字列の最初の部分でなかった場合、これは失敗します。たとえば、入力がInterest Checking For Employeesの場合、Interest Checkingの代わりにCheckingと一致します。最大一致は、一致する最も連続した文字のアカウントを見つけるはずですか?または、入力の最後に最も近いものだけを入力しますか?私が正しくあなたの質問を理解して使用すると、複数の一致がある場合には最長一致を検索したい場合は

-2

使用これが最後の位置を見つけるため

names.lastIndexOf(input) 

は、配列位置に基づいて、値に

2

を取得します。それを行う1つの方法は、あなたの "名前"を降順(長さに基づく)でソートし、最初の試合で止めることです。

SortedMap < Integer、String>を使用すると、「名前」のすべての長さをキーとして使用できます。このような何かを実行して、例えば

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); 
} 

あなたはその後、反復してあなたが最初のマッチを見つけるとすぐに停止します。

これはちょっと「残酷すぎる」でも機能します。あなたは文字列の長さによってソートされた配列を維持した場合

0

私は理解していればあなたは正しく、見つかった文字列は常にクエリの部分文字列ですか?

を使用して部分文字列を検索し、見つかった場合は、それが最も長い場合はそれを保持します。

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); 
    } 
} 

ユーザー988052と同じです。正しい方法でアレイを注文すると、最初の試合で止めることができますので、もう検索する必要はなく、minを取り除くことができます。

長さによって降順配列を注文:

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); 
     } 
    }); 
関連する問題